@@ -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+
7981void HcalTriggerPrimitiveAlgo::overrideParameters (const edm::ParameterSet& ps) {
8082 override_parameters_ = ps;
8183
@@ -278,6 +280,7 @@ void HcalTriggerPrimitiveAlgo::addSignal(const QIE11DataFrame& frame) {
278280void 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
291317void HcalTriggerPrimitiveAlgo::analyze (IntegerCaloSamples& samples, HcalTriggerPrimitiveDigi& result) {
@@ -371,6 +397,7 @@ void HcalTriggerPrimitiveAlgo::analyze(IntegerCaloSamples& samples, HcalTriggerP
371397}
372398
373399void 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 ;
0 commit comments