8 #include "GaudiKernel/Incident.h"
9 #include "GaudiKernel/IIncidentSvc.h"
10 #include "GaudiKernel/GaudiException.h"
23 #include "GaudiKernel/ThreadLocalContext.h"
27 #include <boost/range/adaptor/reversed.hpp>
28 using namespace boost::adaptors;
35 const int L1TriggerTowerToolRun3::s_saturationValue;
36 const int L1TriggerTowerToolRun3::s_maxTowers;
40 L1TriggerTowerToolRun3::L1TriggerTowerToolRun3(
const std::string&
t,
47 m_l1CaloTTIdTools(
"LVL1::L1CaloTTIdTools/L1CaloTTIdTools", this),
48 m_ttSvc(
"CaloTriggerTowerService/CaloTriggerTowerService", this),
49 m_mappingTool(
"", this),
51 m_dynamicPedestalProvider(
"", this)
53 declareInterface<IL1TriggerTowerToolRun3>(
this);
76 if(!
m_ttSvc.retrieve().isSuccess()) {
83 if (scID.isFailure()) {
94 IIncidentSvc* incSvc = 0;
95 if (service(
"IncidentSvc", incSvc).isFailure()) {
99 incSvc->addListener(
this,
"BeginRun");
117 return StatusCode::SUCCESS;
124 return StatusCode::SUCCESS;
131 if (inc.type()==
"BeginRun") {
143 std::vector<int> &
et, std::vector<int> &bcidResults,
144 std::vector<int> &bcidDecisions,
bool useJepLut )
150 process(digits,
id,
et, bcidResults, bcidDecisions, useJepLut);
157 std::vector<int> &
et, std::vector<int> &bcidResults,
158 std::vector<int> &bcidDecisions,
bool useJepLut )
169 bcidDecisions.clear();
176 std::vector<int> lutInput;
187 std::vector<int> decisionRange;
189 bcidDecision(bcidResults, decisionRange, bcidDecisions);
194 std::vector<int> lutOutput;
210 template <
typename DST,
typename SRC>
211 std::vector<DST> convertVectorType(
const std::vector<SRC>&
s) {
212 std::vector<DST>
d(
s.size());
214 [](SRC
v){
return static_cast<DST
>(
v);});
227 ATH_MSG_DEBUG(
"RunParameters:: readoutConfigID " << readoutConfigID);
229 std::vector<uint16_t> digits40;
231 if(readoutConfigID == 5 or readoutConfigID == 6){
234 ATH_MSG_DEBUG(
"80 MHz readout detected, emulating 40 MHz samples");
236 int nSlices =
tt.adc().size();
239 for (
int i=0 ;
i < (nSlices-1)/2 ;
i++ ){
240 digits40.push_back(
tt.adc().at(2*
i+1));
243 else if((nSlices%4)==1){
244 for (
int i=0 ;
i <= (nSlices-1)/2 ;
i++){
245 digits40.push_back(
tt.adc().at(2*
i));
255 const auto& digits = convertVectorType<int>(digits40);
259 ATH_MSG_DEBUG(
"::simulateChannel: ==== Entered Process ====" );
268 bcidDecisions.clear();
277 ATH_MSG_DEBUG(
"::simulateChannel: ---- pedestalCorrection ----" );
280 const std::size_t nCorr =
tt.correctionEnabled().size();
281 const std::size_t filterOffset =
filter.size()/2 - nCorr/2;
282 for(std::size_t iCorr = 0; iCorr < nCorr; ++iCorr) {
283 filter[filterOffset + iCorr] -=
tt.correction()[iCorr] *
tt.correctionEnabled()[iCorr];
289 std::vector<int> lutInput;
292 ATH_MSG_DEBUG(
"::simulateChannel: ---- BCID algorithms ---- ");
299 std::vector<int> decisionRange;
301 bcidDecision(bcidResults, decisionRange, bcidDecisions);
303 ATH_MSG_DEBUG(
"::simulateChannel: bcidDecisionRange " << decisionRange);
304 ATH_MSG_DEBUG(
"::simulateChannel: bcidDecisions " << bcidDecisions);
308 ATH_MSG_DEBUG(
"::simulateChannel: ---- LUT ET calculation ----" );
311 std::vector<int> cpLutOutput, jepLutOutput;
316 ATH_MSG_DEBUG(
"::simulateChannel: jepLut " << jepLutOutput);
318 ATH_MSG_DEBUG(
"::simulateChannel: ---- use ET range ----" );
325 ATH_MSG_DEBUG(
"::simulateChannel: cpLut applyETRange " << outCpLut);
326 ATH_MSG_DEBUG(
"::simulateChannel: jepLut applyETRange " << outJepLut);
329 ATH_MSG_DEBUG(
"::simulateChannel: ==== Leaving Process ====" );
338 std::vector<int> peak;
340 std::vector<int> sat;
344 output.reserve(sat.size());
348 for ( ; itpeak!=peak.end() && itsat!=sat.end(); ++itpeak, ++itsat ) {
349 output.push_back( (*itpeak<<2) + (*itsat<<1) );
360 unsigned int strategy,
int satLow,
int satHigh,
int satLevel, std::vector<int> &
output)
const
363 std::vector<int> peak;
365 std::vector<int> sat;
366 satBcid(digits, satLow, satHigh, satLevel, sat);
369 output.reserve(sat.size());
373 for ( ; itpeak!=peak.end() && itsat!=sat.end(); ++itpeak, ++itsat ) {
374 output.push_back( (*itpeak<<2) + (*itsat<<1) );
383 void L1TriggerTowerToolRun3::bcid(
const std::vector<int> &
filter,
const std::vector<int> &lutInput,
const std::vector<int> &digits,
int energyLow,
int energyHigh,
int decisionSource, std::vector<unsigned int> &decisionConditions,
384 unsigned int strategy,
int satLow,
int satHigh,
int satLevel, std::vector<int> &
result, std::vector<int> &decision)
const
387 std::vector<int> peak;
389 std::vector<int> sat;
390 satBcid(digits, satLow, satHigh, satLevel, sat);
393 result.reserve(sat.size());
398 for ( ; itpeak!=peak.end() && itsat!=sat.end(); ++itpeak, ++itsat ) {
399 result.push_back( (*itpeak<<2) + (*itsat<<1) );
407 std::vector<int> decisionRange;
408 if (!(decisionSource&0
x1))
etRange(digits, energyLow, energyHigh, decisionRange);
409 else etRange(lutInput, energyLow, energyHigh, decisionRange);
419 if(!settings)
return nullptr;
420 return &(settings->firCoefficients());
433 std::vector<int> firCoeffs;
435 const std::vector<short int>* hwCoeffs;
436 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
441 firCoeffs.reserve(hwCoeffs->size());
442 for (
auto &
i :
reverse(*hwCoeffs)) {
443 firCoeffs.push_back(
i);
461 output.reserve(digits.size());
466 for (
unsigned int i = 0;
i < firCoeffs.size(); ++
i) {
467 if (firstFIR < 0 && firCoeffs[
i] != 0) firstFIR =
i;
468 if (firCoeffs[
i] != 0) lastFIR =
i;
470 if (firstFIR < 0) firstFIR = lastFIR + 1;
472 for (
int i = 0;
i < (
int)digits.size();
i++) {
475 if (
i >= 2-firstFIR &&
i < (
int)digits.size()+2-lastFIR) {
476 for (
int j = firstFIR; j <= lastFIR; ++j) {
477 sum += digits[
i+j-2]*firCoeffs[j];
503 strategy = getStrategy<L1CaloPprConditionsContainerRun2>( pprConditionsRun2);
504 }
else ATH_MSG_WARNING(
"::peakBcid: No Conditions Container retrieved" );
517 for (
unsigned int i = 0;
i <
fir.size();
i++) {
520 if (
i > 0 &&
i <
fir.size()-1) {
540 if(!settings)
return std::make_tuple(
false, 0, 0, 0);
541 return std::make_tuple(
true, settings->satBcidLevel(), settings->satBcidThreshLow(),
542 settings->satBcidThreshHigh());
555 bool available =
false;
556 std::tie(available, satLevel, satLow, satHigh) = getSaturation<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
557 if(!available)
ATH_MSG_WARNING(
"::satBcid: No L1CaloPprConditions found" );
558 }
else ATH_MSG_WARNING(
"::satBcid: No Conditions Container retrieved" );
561 <<
" satLow: " << satLow
562 <<
" satHigh: " << satHigh );
572 output.reserve(digits.size());
577 for (
unsigned int i = 0;
i<digits.size();
i++) {
583 if (digits[
i]>=satLevel) {
584 if (enabled &&
i>1) {
585 bool low = (digits[
i-2]>satLow);
586 bool high = (digits[
i-1]>satHigh);
621 int decisionSource = 0;
625 decisionSource = getDecisionSource<L1CaloPprConditionsContainerRun2>(pprConditionsRun2);
627 }
else ATH_MSG_WARNING(
"::bcidDecisionRange: No Conditions Container retrieved" );
632 ATH_MSG_DEBUG(
"::bcidDecisionRange: decisionSource: " << decisionSource);
647 unsigned int decision1 = 0;
648 unsigned int decision2 = 0;
649 unsigned int decision3 = 0;
653 std::tie(decision1, decision2, decision3) = getBcidDecision<L1CaloPprConditionsContainerRun2>(pprConditionsRun2);
654 }
else ATH_MSG_WARNING(
"::bcidDecision: No Conditions Container retrieved" );
657 std::vector<unsigned int>
mask = { decision3, decision2, decision1 };
660 << decision3 <<
" " << decision2 <<
" " << decision1 << MSG::dec );
670 output.reserve(bcidResults.size());
672 std::vector<int>::const_iterator itBcid = bcidResults.begin();
673 std::vector<int>::const_iterator itRange =
range.begin();
674 int nRange =
mask.size();
676 for ( ; itBcid != bcidResults.end() && itRange !=
range.end(); ++itBcid, ++itRange) {
677 if ((*itRange) < nRange && (
mask[*itRange]&(0
x1<<*itBcid)))
output.push_back(1);
692 double offsetReal = 0;
695 unsigned short scale_menu = 0;
699 const std::vector<short int>* hwCoeffs;
703 const EventContext& ctx = Gaudi::Hive::currentContext();
709 strategy = settings->lutCpStrategy();
710 slope = settings->lutCpSlope();
711 cut = settings->lutCpNoiseCut();
712 ped = settings->pedValue();
713 pedMean = settings->pedMean();
715 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
718 scale_menu = l1Menu->thrExtraInfo().EM().emScale();
721 for(
auto &
coeffs : *hwCoeffs) {
725 offsetReal = pedMean * hwCoeffSum /
pow(2.,startBit);
728 offsetReal = pedMean *
static_cast<double>(hwCoeffSum) *
static_cast<double>(slope) /
pow(2.,
static_cast<double>(startBit)) -
static_cast<double>(slope)/2.;
730 offset =
static_cast<unsigned short>( offsetReal < 0. ? 0 : offsetReal + 0.5 );
732 ATH_MSG_DEBUG(
"::cpLut: Offset: offset/strategy/pedMean/firCoeffSum/startBit/slope: "
733 <<
offset <<
" " <<
strategy <<
" " <<
" " << pedMean <<
" " << hwCoeffSum <<
" " << startBit <<
" " << slope );
736 }
else ATH_MSG_WARNING(
"::cpLut: No Conditions Container retrieved" );
738 ATH_MSG_DEBUG(
"::cpLut: LUT strategy/offset/slope/cut/ped: "
741 unsigned int noiseCut = 0;
743 if (noiseCut > 0)
cut = noiseCut;
767 double offsetReal = 0;
770 unsigned short scale_db = 0;
771 unsigned short scale_menu = 0;
775 const std::vector<short int>* hwCoeffs;
788 const EventContext& ctx = Gaudi::Hive::currentContext();
794 strategy = settings->lutJepStrategy();
795 slope = settings->lutJepSlope();
796 cut = settings->lutJepNoiseCut();
797 ped = settings->pedValue();
798 pedMean = settings->pedMean();
799 scale_db = settings->lutJepScale();
802 scale_menu = l1Menu->thrExtraInfo().JET().jetScale();
805 par1 = settings->lutJepPar1();
806 par2 = settings->lutJepPar2();
807 par3 = settings->lutJepPar3();
808 par4 = settings->lutJepPar4();
811 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
813 for(
auto &
coeffs : *hwCoeffs) {
817 offsetReal = pedMean * hwCoeffSum /
pow(2.,startBit);
820 offsetReal = pedMean *
static_cast<double>(hwCoeffSum) *
static_cast<double>(slope) /
pow(2.,
static_cast<double>(startBit)) -
static_cast<double>(slope)/2.;
822 offset =
static_cast<unsigned short>( offsetReal < 0. ? 0 : offsetReal + 0.5 );
824 ATH_MSG_VERBOSE(
"::jepLut: Offset: offset/strategy/pedMean/firCoeffSum/startBit/slope: "
825 <<
offset <<
" " <<
strategy <<
" " <<
" " << pedMean <<
" " << hwCoeffSum <<
" " << startBit <<
" " << slope );
828 }
else ATH_MSG_WARNING(
"::jepLut: No Conditions Container retrieved" );
833 unsigned int noiseCut = 0;
835 if (noiseCut > 0)
cut = noiseCut;
838 nonLinearLut(
fir, slope,
offset,
cut, scale_db, par1, par2, par3, par4,
disabled,
output);
868 const int reScale = 2;
869 for(
auto it :
fir) {
880 out = (
it*slope*reScale -
offset*reScale + 2048)>>12;
892 void L1TriggerTowerToolRun3::nonLinearLut(
const std::vector<int> &fir,
int slope,
int offset,
int cut,
int scale,
short par1,
short par2,
short par3,
short par4,
bool disabled, std::vector<int> &
output)
const
898 for(
auto it :
fir) {
902 double nll_slope = 0.001 *
scale;
903 double nll_offset = 0.001 * par1;
904 double nll_ampl = 0.001 * par2;
905 double nll_expo = 0.;
907 nll_expo = -1. / (4096 * 0.001*par3);
911 double nll_noise = 0.001 * par4;
935 std::vector<int>::const_iterator itlut =
lut.begin();
936 std::vector<int>::const_iterator itrange =
range.begin();
937 while ( itlut !=
lut.end() && itrange !=
range.end() ) {
939 else output.push_back(*itlut);
953 if(!settings)
return std::make_tuple(
false, 0, 0);
954 return std::make_tuple(
true, settings->bcidEnergyRangeLow(), settings->bcidEnergyRangeHigh());
967 bool available =
false;
968 std::tie(available, energyLow, energyHigh) = getBcidEnergyRange<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
969 if(!available)
ATH_MSG_WARNING(
"::etRange: No L1CaloPprConditions found");
970 }
else ATH_MSG_WARNING(
"::etRange: No Conditions Container retrieved");
973 <<
" energyHigh: " << energyHigh);
985 if (
it <= energyLow)
output.push_back(0);
986 else if (
it <= energyHigh)
output.push_back(1);
1000 if(!settings)
return std::make_tuple(
false, 0);
1001 return std::make_tuple(
true, settings->firStartBit());
1007 unsigned int start = 0;
1011 bool available =
false;
1012 std::tie(available,
start) = getFirStartBit<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
1013 if(!available)
ATH_MSG_WARNING(
"::dropBits: No L1CaloPprConditions found" );
1014 }
else ATH_MSG_WARNING(
"::dropBits: No Conditions Container retrieved" );
1034 for(
auto it :
fir) {
1049 const std::vector<short int>* hwCoeffs =
nullptr;
1050 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2 );
1056 firCoeffs.reserve(hwCoeffs->size());
1057 for (
int i = hwCoeffs->size()-1;
i >= 0; --
i) firCoeffs.push_back((*hwCoeffs)[
i]);
1059 }
else ATH_MSG_WARNING(
"::firParams: No L1CaloPprConditions found" );
1060 }
else ATH_MSG_WARNING(
"::firParams: No Conditions Container retrieved" );
1069 unsigned int &peakFinderStrategy,
int &satLow,
int &satHigh,
int &satLevel)
const
1074 decisionConditions.clear();
1075 peakFinderStrategy = 0;
1084 std::tuple<unsigned int, unsigned int, unsigned int>
bcidDecision;
1085 std::tuple<bool, int, int> bcidEnergyRange;
1086 std::tuple<bool, int, int, int> saturation;
1089 bcidDecision = getBcidDecision<Cont>(pprConditionsRun2);
1090 peakFinderStrategy = getStrategy<Cont>(pprConditionsRun2);
1091 decisionSource = getDecisionSource<Cont>(pprConditionsRun2);
1092 bcidEnergyRange = getBcidEnergyRange<Cont>(
channelId.id(), pprConditionsRun2);
1093 saturation = getSaturation<Cont>(
channelId.id(), pprConditionsRun2);
1099 if(get<0>(bcidEnergyRange)) {
1100 std::tie(
std::ignore, energyLow, energyHigh) = bcidEnergyRange;
1103 if(get<0>(saturation)) {
1104 std::tie(
std::ignore, satLevel, satLow, satHigh) = saturation;
1106 }
else ATH_MSG_WARNING(
"::bcid:Params No Conditions Container retrieved" );
1109 <<
" satLow: " << satLow <<
" satHigh: " << satHigh <<
endmsg
1110 <<
" energyLow: " << energyLow <<
" energyHigh: " << energyHigh <<
endmsg
1111 <<
" decisionSource: " << decisionSource <<
" peakFinderStrategy: "
1112 << peakFinderStrategy );
1121 double offsetReal = 0;
1128 const std::vector<short int>* hwCoeffs;
1141 strategy = settings->lutCpStrategy();
1142 slope = settings->lutCpSlope();
1143 cut = settings->lutCpNoiseCut();
1144 pedValue = settings->pedValue();
1145 pedMean = settings->pedMean();
1147 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(), pprConditionsRun2);
1149 for(
auto &
coeffs : *hwCoeffs) {
1153 offsetReal = pedMean * hwCoeffSum /
pow(2.,startBit);
1156 offsetReal = pedMean * hwCoeffSum * slope /
pow(2.,startBit) - slope/2.;
1158 offset =
static_cast<unsigned short>( offsetReal < 0. ? 0 : offsetReal + 0.5 );
1160 ATH_MSG_VERBOSE(
"::jepLutParams: Offset: offset/strategy/pedMean/firCoeffSum/startBit/slope: "
1161 <<
offset <<
" " <<
strategy <<
" " <<
" " << pedMean <<
" " << hwCoeffSum <<
" " << startBit <<
" " << slope );
1163 }
else ATH_MSG_WARNING(
"::cpLutParams: No L1CaloPprConditions found" );
1164 }
else ATH_MSG_WARNING(
"::cpLutParams: No Conditions Container retrieved" );
1166 ATH_MSG_VERBOSE(
"::cpLutParams: LUT startBit/strategy/offset/slope/cut/pedValue/pedMean: "
1167 << startBit <<
" " <<
strategy <<
" " <<
offset <<
" " << slope <<
" " <<
cut <<
" " << pedValue <<
" " << pedMean );
1168 unsigned int noiseCut = 0;
1170 if (noiseCut > 0)
cut = noiseCut;
1178 double offsetReal = 0;
1185 const std::vector<short int>* hwCoeffs;
1197 strategy = settings->lutJepStrategy();
1198 slope = settings->lutJepSlope();
1199 cut = settings->lutJepNoiseCut();
1200 pedValue = settings->pedValue();
1201 pedMean = settings->pedMean();
1203 hwCoeffs = getFirCoefficients<L1CaloPprConditionsContainerRun2>(
channelId.id(),pprConditionsRun2);
1205 for(
auto &
coeffs : *hwCoeffs) {
1209 offsetReal = pedMean * hwCoeffSum /
pow(2.,startBit);
1212 offsetReal = pedMean * hwCoeffSum * slope /
pow(2.,startBit) - slope/2.;
1214 offset =
static_cast<unsigned short>( offsetReal < 0. ? 0 : offsetReal + 0.5 );
1216 ATH_MSG_VERBOSE(
"::jepLutParams: Offset: offset/strategy/pedMean/firCoeffSum/startBit/slope: "
1217 <<
offset <<
" " <<
strategy <<
" " <<
" " << pedMean <<
" " << hwCoeffSum <<
" " << startBit <<
" " << slope );
1219 }
else ATH_MSG_WARNING(
"::jepLutParams: No L1CaloPprConditions found" );
1220 }
else ATH_MSG_WARNING(
"::jepLutParams: No Conditions Container retrieved" );
1222 ATH_MSG_VERBOSE(
"::jepLutParams: LUT startBit/strategy/offset/slope/cut/pedValue/pedMean: "
1223 << startBit <<
" " <<
strategy <<
" " <<
offset <<
" " << slope <<
" " <<
cut <<
" " << pedValue <<
" " << pedMean );
1224 unsigned int noiseCut = 0;
1226 if (noiseCut > 0)
cut = noiseCut;
1249 HWIdentifier hwId(0);
1251 try { hwId =
m_ttSvc->createTTChannelID(
id,
false); }
1276 }
else if (
absEta < 3.2) {
1308 coolId =
m_ttSvc->createL1CoolChannelId(hwId);
1328 bool override =
false;
1331 satOverride = getSatOverride<L1CaloPprConditionsContainerRun2>(pprConditionsRun2);
1336 }
else ATH_MSG_WARNING(
"::satOverride: No Conditions Container retrieved" );
1339 <<
" has saturation override flag " <<
override );
1348 unsigned int noiseCut = 0;
1357 bool isDisabled =
false;
1364 if (!disabledChan->disabledBits()) {
1368 if (deadError.
chanValid()) noiseCut = disabledChan->noiseCut();
1371 }
else isDisabled =
true;
1374 <<
"::disabledChannel: calibErrorCode: " << (disabledChan->calibErrorCode()).errorCode()
1375 <<
" deadErrorCode: " << (disabledChan->deadErrorCode()).errorCode()
1376 <<
" noiseCut: " << disabledChan->noiseCut()
1377 <<
" disabledBits: " << disabledChan->disabledBits()
1381 ATH_MSG_DEBUG(
"::disabledChannel: No L1CaloPprDisabledChannel found" );
1384 ATH_MSG_WARNING(
"::disabledChannel: No DisabledChannel Container retrieved" );
1386 if (isDisabled)
ATH_MSG_DEBUG(
"::disabledChannel: Channel is disabled" );
1398 float abseta = std::abs(
eta);
1399 if (abseta<3.2)
return eta;
1401 int sign = ((
eta > 0) ? 1 : -1);
1402 if (abseta < 3.6)
eta = 3.15 *
sign;
1403 else if (abseta < 4.0)
eta = 3.33 *
sign;
1404 else if (abseta < 4.5)
eta = 3.72 *
sign;
1408 if (abseta < 3.6)
eta = 3.36;
1409 else if (abseta < 4.0)
eta = 3.45;
1410 else if (abseta < 4.5)
eta = 4.17;
1414 if (abseta < 3.6)
eta = -3.45;
1415 else if (abseta < 4.0)
eta = -3.36;
1416 else if (abseta < 4.5)
eta = -4.19;
1429 throw GaudiException(
"No mapping tool configured",
1430 "L1TriggerTowerToolRun3::FCalTTeta", StatusCode::FAILURE);
1436 unsigned int mcm =
channelId.subModule();
1472 <<
"::refValues: errorCode: " << (ftref->
errorCode()).errorCode()
1473 << MSG::dec <<
" reference: " << ftref->
refValue() <<
" calib: " << ftref->
calibValue() );
1486 unsigned nFIR = firInOut.size();
1487 correctionOut.assign(nFIR, 0
u);
1492 for(
unsigned i = 0;
i != nFIR; ++
i) {
1494 firInOut[
i] -= correctionOut[
i];
1496 if(firInOut[
i] < 0) firInOut[
i] = 0;
1499 ATH_MSG_DEBUG(
"::pedestalCorrection(BCID=" <<
bcid <<
", mu = " <<
mu <<
"): " << correctionOut);
1505 const EventContext& ctx = Gaudi::Hive::currentContext();
1506 if (ctx.eventID().run_number() >= 253377)
return true;
1519 if (
sc.isFailure()) {