Skip to content

Commit 98e05a9

Browse files
authored
Merge pull request #34252 from TaeunKwon/FixingSaturation
Updates of the TP reconstruction algorithm to fix the TP energy saturation effect
2 parents 97a97d3 + feaae38 commit 98e05a9

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

SimCalorimetry/HcalTrigPrimAlgos/interface/HcalTriggerPrimitiveAlgo.h

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class HcalTriggerPrimitiveAlgo {
8989
void setNumFilterPresamplesHEQIE11(int presamples) { numberOfFilterPresamplesHEQIE11_ = presamples; }
9090

9191
void setUpgradeFlags(bool hb, bool he, bool hf);
92+
void setFixSaturationFlag(bool fix_saturation);
9293
void overrideParameters(const edm::ParameterSet& ps);
9394

9495
private:
@@ -110,7 +111,10 @@ class HcalTriggerPrimitiveAlgo {
110111
/// adds the actual digis
111112
void analyze(IntegerCaloSamples& samples, HcalTriggerPrimitiveDigi& result);
112113
// 2017 and later: QIE11
113-
void analyzeQIE11(IntegerCaloSamples& samples, HcalTriggerPrimitiveDigi& result, const HcalFinegrainBit& fg_algo);
114+
void analyzeQIE11(IntegerCaloSamples& samples,
115+
std::vector<bool> sample_saturation,
116+
HcalTriggerPrimitiveDigi& result,
117+
const HcalFinegrainBit& fg_algo);
114118
// Version 0: RCT
115119
void analyzeHF(IntegerCaloSamples& samples, HcalTriggerPrimitiveDigi& result, const int hf_lumi_shift);
116120
// Version 1: 1x1
@@ -163,6 +167,9 @@ class HcalTriggerPrimitiveAlgo {
163167
typedef std::map<HcalTrigTowerDetId, IntegerCaloSamples> SumMap;
164168
SumMap theSumMap;
165169

170+
typedef std::map<HcalTrigTowerDetId, std::vector<bool>> SatMap;
171+
SatMap theSatMap;
172+
166173
struct HFDetails {
167174
IntegerCaloSamples long_fiber;
168175
IntegerCaloSamples short_fiber;
@@ -210,6 +217,8 @@ class HcalTriggerPrimitiveAlgo {
210217
bool upgrade_he_ = false;
211218
bool upgrade_hf_ = false;
212219

220+
bool fix_saturation_ = false;
221+
213222
edm::ParameterSet override_parameters_;
214223

215224
bool override_adc_hf_ = false;
@@ -250,6 +259,7 @@ void HcalTriggerPrimitiveAlgo::run(const HcalTPGCoder* incoder,
250259
conditions_ = conditions;
251260

252261
theSumMap.clear();
262+
theSatMap.clear();
253263
theTowerMapFGSum.clear();
254264
HF_Veto.clear();
255265
fgMap_.clear();
@@ -293,13 +303,18 @@ void HcalTriggerPrimitiveAlgo::run(const HcalTPGCoder* incoder,
293303
if (fgMap_.find(item.first) != fgMap_.end()) {
294304
analyze(item.second, result.back());
295305
} else if (fgUpgradeMap_.find(item.first) != fgUpgradeMap_.end()) {
296-
analyzeQIE11(item.second, result.back(), fg_algo);
306+
SatMap::iterator item_sat = theSatMap.find(detId);
307+
if (item_sat == theSatMap.end())
308+
analyzeQIE11(item.second, std::vector<bool>(), result.back(), fg_algo);
309+
else
310+
analyzeQIE11(item.second, item_sat->second, result.back(), fg_algo);
297311
}
298312
}
299313
}
300314

301315
// Free up some memory
302316
theSumMap.clear();
317+
theSatMap.clear();
303318
theTowerMapFGSum.clear();
304319
HF_Veto.clear();
305320
fgMap_.clear();

SimCalorimetry/HcalTrigPrimAlgos/src/HcalTriggerPrimitiveAlgo.cc

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ void HcalTriggerPrimitiveAlgo::setUpgradeFlags(bool hb, bool he, bool hf) {
7676
upgrade_hf_ = hf;
7777
}
7878

79+
void HcalTriggerPrimitiveAlgo::setFixSaturationFlag(bool fix_saturation) { fix_saturation_ = fix_saturation; }
80+
7981
void HcalTriggerPrimitiveAlgo::overrideParameters(const edm::ParameterSet& ps) {
8082
override_parameters_ = ps;
8183

@@ -278,6 +280,7 @@ void HcalTriggerPrimitiveAlgo::addSignal(const QIE11DataFrame& frame) {
278280
void HcalTriggerPrimitiveAlgo::addSignal(const IntegerCaloSamples& samples) {
279281
HcalTrigTowerDetId id(samples.id());
280282
SumMap::iterator itr = theSumMap.find(id);
283+
281284
if (itr == theSumMap.end()) {
282285
theSumMap.insert(std::make_pair(id, samples));
283286
} else {
@@ -286,6 +289,29 @@ void HcalTriggerPrimitiveAlgo::addSignal(const IntegerCaloSamples& samples) {
286289
(itr->second)[i] += samples[i];
287290
}
288291
}
292+
293+
// if fix_saturation == true, keep track of tower with saturated input LUT
294+
if (fix_saturation_) {
295+
SatMap::iterator itr_sat = theSatMap.find(id);
296+
297+
assert((itr == theSumMap.end()) == (itr_sat == theSatMap.end()));
298+
299+
if (itr_sat == theSatMap.end()) {
300+
vector<bool> check_sat;
301+
for (int i = 0; i < samples.size(); ++i) {
302+
if (!(samples[i] < QIE11_LINEARIZATION_ET)) {
303+
check_sat.push_back(true);
304+
} else
305+
check_sat.push_back(false);
306+
}
307+
theSatMap.insert(std::make_pair(id, check_sat));
308+
} else {
309+
for (int i = 0; i < samples.size(); ++i) {
310+
if (!(samples[i] < QIE11_LINEARIZATION_ET))
311+
(itr_sat->second)[i] = true;
312+
}
313+
}
314+
}
289315
}
290316

291317
void HcalTriggerPrimitiveAlgo::analyze(IntegerCaloSamples& samples, HcalTriggerPrimitiveDigi& result) {
@@ -371,6 +397,7 @@ void HcalTriggerPrimitiveAlgo::analyze(IntegerCaloSamples& samples, HcalTriggerP
371397
}
372398

373399
void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
400+
vector<bool> sample_saturation,
374401
HcalTriggerPrimitiveDigi& result,
375402
const HcalFinegrainBit& fg_algo) {
376403
HcalDetId detId(samples.id());
@@ -398,15 +425,26 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
398425
IntegerCaloSamples sum(samples.id(), samples.size());
399426

400427
std::vector<HcalTrigTowerDetId> ids = theTrigTowerGeometry->towerIds(detId);
428+
429+
// keep track of tower with saturated energy and force the total TP saturated
430+
bool force_saturation[samples.size()];
431+
for (int i = 0; i < samples.size(); i++) {
432+
force_saturation[i] = false;
433+
}
434+
401435
//slide algo window
402436
for (unsigned int ibin = 0; ibin < dgSamples - shrink; ++ibin) {
403437
int algosumvalue = 0;
438+
bool check_sat = false;
404439
for (unsigned int i = 0; i < filterSamples; i++) {
405440
//add up value * scale factor
406441
// In addition, divide by two in the 10 degree phi segmentation region
407442
// to mimic 5 degree segmentation for the trigger
408443
unsigned int sample = samples[ibin + i];
409-
if (sample > QIE11_MAX_LINEARIZATION_ET)
444+
445+
if (fix_saturation_ && (sample_saturation.size() > ibin + i))
446+
check_sat = (sample_saturation[ibin + i] | (sample > QIE11_MAX_LINEARIZATION_ET));
447+
else if (sample > QIE11_MAX_LINEARIZATION_ET)
410448
sample = QIE11_MAX_LINEARIZATION_ET;
411449

412450
// Usually use a segmentation factor of 1.0 but for ieta >= 21 use 0.5
@@ -426,6 +464,9 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
426464
//else if (algosumvalue>QIE11_LINEARIZATION_ET) sum[ibin]=QIE11_LINEARIZATION_ET;
427465
else
428466
sum[ibin] = algosumvalue; //assign value to sum[]
467+
468+
if (check_sat)
469+
force_saturation[ibin] = true;
429470
}
430471

431472
std::vector<int> finegrain(tpSamples, false);
@@ -448,6 +489,8 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
448489

449490
if (isPeak) {
450491
output[ibin] = std::min<unsigned int>(sum[idx], QIE11_MAX_LINEARIZATION_ET);
492+
if (fix_saturation_ && force_saturation[idx])
493+
output[ibin] = QIE11_MAX_LINEARIZATION_ET;
451494
} else {
452495
// Not a peak
453496
output[ibin] = 0;

SimCalorimetry/HcalTrigPrimProducers/python/hcaltpdigi_cfi.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from Configuration.Eras.Modifier_run2_HE_2017_cff import run2_HE_2017
55
from Configuration.Eras.Modifier_run2_HF_2017_cff import run2_HF_2017
66
from Configuration.Eras.Modifier_run3_HB_cff import run3_HB
7+
from Configuration.Eras.Modifier_run3_common_cff import run3_common
78

89
LSParameter =cms.untracked.PSet(
910
HcalFeatureHFEMBit= cms.bool(False),
@@ -66,6 +67,8 @@
6667
upgradeHB = cms.bool(False),
6768
upgradeHE = cms.bool(False),
6869

70+
applySaturationFix = cms.bool(False), # Apply the TP energy saturation fix for Peak Finder Algorithm only for Run3
71+
6972
# parameters = cms.untracked.PSet(
7073
# FGVersionHBHE=cms.uint32(0),
7174
# TDCMask=cms.uint64(0xFFFFFFFFFFFFFFFF),
@@ -98,4 +101,5 @@
98101
)
99102
run2_HF_2017.toModify(tpScales.HF, NCTShift=cms.int32(2))
100103
run3_HB.toModify(simHcalTriggerPrimitiveDigis, upgradeHB=cms.bool(True))
104+
run3_common.toModify(simHcalTriggerPrimitiveDigis, applySaturationFix=cms.bool(True))
101105
run3_HB.toModify(tpScales.HBHE, LSBQIE11Overlap=cms.double(1/16.))

SimCalorimetry/HcalTrigPrimProducers/src/HcalTrigPrimDigiProducer.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ HcalTrigPrimDigiProducer::HcalTrigPrimDigiProducer(const edm::ParameterSet& ps)
5050
theAlgo_.overrideParameters(pset);
5151
}
5252
theAlgo_.setUpgradeFlags(upgrades[0], upgrades[1], upgrades[2]);
53+
theAlgo_.setFixSaturationFlag(ps.getParameter<bool>("applySaturationFix"));
5354

5455
HFEMB_ = false;
5556
if (ps.exists("LSConfig")) {

0 commit comments

Comments
 (0)