Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HCAL: Bugfix of PFA1' Trigger Primitive algo by switching to integer based math #38753

Merged
merged 6 commits into from Jul 22, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -80,7 +80,7 @@ class HcalTriggerPrimitiveAlgo {
HcalTrigPrimDigiCollection& result);
void setPeakFinderAlgorithm(int algo);
void setWeightsQIE11(const edm::ParameterSet& weightsQIE11);
void setWeightQIE11(int aieta, double weight);
void setWeightQIE11(int aieta, int weight);
void setNCTScaleShift(int);
void setRCTScaleShift(int);

Expand Down Expand Up @@ -136,7 +136,7 @@ class HcalTriggerPrimitiveAlgo {
double theThreshold;
bool peakfind_;
std::vector<double> weights_;
std::array<std::array<double, 2>, 29> weightsQIE11_;
std::array<std::array<int, 2>, 29> weightsQIE11_;
int latency_;
uint32_t FG_threshold_;
std::vector<uint32_t> FG_HF_thresholds_;
Expand Down
88 changes: 63 additions & 25 deletions SimCalorimetry/HcalTrigPrimAlgos/src/HcalTriggerPrimitiveAlgo.cc
Expand Up @@ -439,38 +439,76 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
for (unsigned int ibin = 0; ibin < dgSamples - shrink; ++ibin) {
int algosumvalue = 0;
bool check_sat = false;
for (unsigned int i = 0; i < filterSamples; i++) {
//TP energy calculation for PFA2
if (weightsQIE11_[theIeta][0] == 255) {
for (unsigned int i = 0; i < filterSamples; i++) {
//add up value * scale factor
// In addition, divide by two in the 10 degree phi segmentation region
// to mimic 5 degree segmentation for the trigger
unsigned int sample = samples[ibin + i];

if (fix_saturation_ && (sample_saturation.size() > ibin + i))
check_sat = (check_sat | sample_saturation[ibin + i] | (sample > QIE11_MAX_LINEARIZATION_ET));

if (sample > QIE11_MAX_LINEARIZATION_ET)
sample = QIE11_MAX_LINEARIZATION_ET;

// Usually use a segmentation factor of 1.0 but for ieta >= 21 use 0.5
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This comment is outdated with the new definition of segmentationFactor

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @perrotta for all of the comments! I have implemented them

int segmentationFactor = 1;
if (ids.size() == 2) {
segmentationFactor = 2;
}

algosumvalue += int(sample / segmentationFactor);
}
if (algosumvalue < 0)
sum[ibin] = 0; // low-side
//high-side
//else if (algosumvalue>QIE11_LINEARIZATION_ET) sum[ibin]=QIE11_LINEARIZATION_ET;
else
sum[ibin] = algosumvalue; //assign value to sum[]

if (check_sat)
force_saturation[ibin] = true;
//TP energy calculation for PFA1' and PFA1
} else {
//add up value * scale factor
// In addition, divide by two in the 10 degree phi segmentation region
// to mimic 5 degree segmentation for the trigger
unsigned int sample = samples[ibin + i];
int sampleTS = samples[ibin + 1];
int sampleTSminus1 = samples[ibin];

if (fix_saturation_ && (sample_saturation.size() > ibin + i))
check_sat = (check_sat | sample_saturation[ibin + i] | (sample > QIE11_MAX_LINEARIZATION_ET));
if (fix_saturation_ && (sample_saturation.size() > ibin + 1))
check_sat = (sample_saturation[ibin + 1] | (sampleTS >= QIE11_MAX_LINEARIZATION_ET) | sample_saturation[ibin] |
(sampleTSminus1 >= QIE11_MAX_LINEARIZATION_ET));

if (sample > QIE11_MAX_LINEARIZATION_ET)
sample = QIE11_MAX_LINEARIZATION_ET;
if (sampleTS > QIE11_MAX_LINEARIZATION_ET)
sampleTS = QIE11_MAX_LINEARIZATION_ET;

if (sampleTSminus1 > QIE11_MAX_LINEARIZATION_ET)
sampleTSminus1 = QIE11_MAX_LINEARIZATION_ET;

// Usually use a segmentation factor of 1.0 but for ieta >= 21 use 0.5
double segmentationFactor = 1.0;
int segmentationFactor = 1;
if (ids.size() == 2) {
segmentationFactor = 0.5;
segmentationFactor = 2;
}

// Based on the |ieta| of the sample, retrieve the correct region weight
double theWeight = weightsQIE11_[theIeta][i];
int theWeight = weightsQIE11_[theIeta][0];

algosumvalue += int(sample * segmentationFactor * theWeight);
}
if (algosumvalue < 0)
sum[ibin] = 0; // low-side
//high-side
//else if (algosumvalue>QIE11_LINEARIZATION_ET) sum[ibin]=QIE11_LINEARIZATION_ET;
else
sum[ibin] = algosumvalue; //assign value to sum[]
algosumvalue = ((sampleTS << 8) - (sampleTSminus1 * theWeight)) / 256 / segmentationFactor;

if (algosumvalue < 0)
sum[ibin] = 0; // low-side
//high-side
//else if (algosumvalue>QIE11_LINEARIZATION_ET) sum[ibin]=QIE11_LINEARIZATION_ET;
else
sum[ibin] = algosumvalue; //assign value to sum[]

if (check_sat)
force_saturation[ibin] = true;
if (check_sat)
force_saturation[ibin] = true;
}
}

std::vector<int> finegrain(tpSamples, false);
Expand All @@ -490,13 +528,13 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
}

//Only run the peak-finder when the PFA2 FIR filter is running, which corresponds to weights = 1
if (weightsQIE11_[theIeta][0] == 1) {
if (weightsQIE11_[theIeta][0] == 255) {
bool isPeak = (sum[idx] > sum[idx - 1] && sum[idx] >= sum[idx + 1] && sum[idx] > theThreshold);
if (isPeak) {
output[ibin] = std::min<unsigned int>(sum[idx], QIE11_MAX_LINEARIZATION_ET);

if (fix_saturation_ && force_saturation[idx] && ids.size() == 2)
output[ibin] = QIE11_MAX_LINEARIZATION_ET * 0.5;
output[ibin] = QIE11_MAX_LINEARIZATION_ET / 2;
else if (fix_saturation_ && force_saturation[idx])
output[ibin] = QIE11_MAX_LINEARIZATION_ET;

Expand All @@ -508,7 +546,7 @@ void HcalTriggerPrimitiveAlgo::analyzeQIE11(IntegerCaloSamples& samples,
output[ibin] = std::min<unsigned int>(sum[idx], QIE11_MAX_LINEARIZATION_ET);

if (fix_saturation_ && force_saturation[idx] && ids.size() == 2)
output[ibin] = QIE11_MAX_LINEARIZATION_ET * 0.5;
output[ibin] = QIE11_MAX_LINEARIZATION_ET / 2;
else if (fix_saturation_ && force_saturation[idx])
output[ibin] = QIE11_MAX_LINEARIZATION_ET;
}
Expand Down Expand Up @@ -957,15 +995,15 @@ void HcalTriggerPrimitiveAlgo::setWeightsQIE11(const edm::ParameterSet& weightsQ
std::vector<std::string> ietaStrs = weightsQIE11.getParameterNames();
for (auto& ietaStr : ietaStrs) {
// Strip off "ieta" part of key and just use integer value in map
auto const& v = weightsQIE11.getParameter<std::vector<double>>(ietaStr);
auto const& v = weightsQIE11.getParameter<std::vector<int>>(ietaStr);
weightsQIE11_[std::stoi(ietaStr.substr(4))] = {{v[0], v[1]}};
}
}

void HcalTriggerPrimitiveAlgo::setWeightQIE11(int aieta, double weight) {
void HcalTriggerPrimitiveAlgo::setWeightQIE11(int aieta, int weight) {
// Simple map of |ieta| in HBHE to weight
// Only one weight for SOI-1 TS
weightsQIE11_[aieta] = {{weight, 1.0}};
weightsQIE11_[aieta] = {{weight, 255}};
}

void HcalTriggerPrimitiveAlgo::setPeakFinderAlgorithm(int algo) {
Expand Down
Expand Up @@ -192,20 +192,20 @@ void HcalTrigPrimDigiProducer::beginRun(const edm::Run& run, const edm::EventSet
if (!overrideDBweightsAndFilterHB_) {
if (fixedPointWeight != -1.0) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixedPointWeight is an integer, please don't ask it being different from a float!

Analogously, please modify the initialization with a "-1" integer value in

theAlgo_.setNumFilterPresamplesHBQIE11(1);
theAlgo_.setWeightQIE11(aieta, -static_cast<double>(fixedPointWeight) / 256.0);
theAlgo_.setWeightQIE11(aieta, (fixedPointWeight));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
theAlgo_.setWeightQIE11(aieta, (fixedPointWeight));
theAlgo_.setWeightQIE11(aieta, fixedPointWeight);

} else {
theAlgo_.setNumFilterPresamplesHBQIE11(0);
theAlgo_.setWeightQIE11(aieta, 1.0);
theAlgo_.setWeightQIE11(aieta, 255);
}
}
} else if (aieta < lastHERing) {
if (!overrideDBweightsAndFilterHE_) {
if (fixedPointWeight != -1.0) {
theAlgo_.setNumFilterPresamplesHEQIE11(1);
theAlgo_.setWeightQIE11(aieta, -static_cast<double>(fixedPointWeight) / 256.0);
theAlgo_.setWeightQIE11(aieta, (fixedPointWeight));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
theAlgo_.setWeightQIE11(aieta, (fixedPointWeight));
theAlgo_.setWeightQIE11(aieta, fixedPointWeight);

} else {
theAlgo_.setNumFilterPresamplesHEQIE11(0);
theAlgo_.setWeightQIE11(aieta, 1.0);
theAlgo_.setWeightQIE11(aieta, 255);
}
}
}
Expand Down
56 changes: 28 additions & 28 deletions SimCalorimetry/HcalTrigPrimProducers/python/hcaltpdigi_cfi.py
Expand Up @@ -18,34 +18,34 @@
peakFilter = cms.bool(True),
weights = cms.vdouble(1.0, 1.0), ##hardware algo
weightsQIE11 = cms.PSet(
ieta1 = cms.vdouble(1.0, 1.0),
ieta2 = cms.vdouble(1.0, 1.0),
ieta3 = cms.vdouble(1.0, 1.0),
ieta4 = cms.vdouble(1.0, 1.0),
ieta5 = cms.vdouble(1.0, 1.0),
ieta6 = cms.vdouble(1.0, 1.0),
ieta7 = cms.vdouble(1.0, 1.0),
ieta8 = cms.vdouble(1.0, 1.0),
ieta9 = cms.vdouble(1.0, 1.0),
ieta10 = cms.vdouble(1.0, 1.0),
ieta11 = cms.vdouble(1.0, 1.0),
ieta12 = cms.vdouble(1.0, 1.0),
ieta13 = cms.vdouble(1.0, 1.0),
ieta14 = cms.vdouble(1.0, 1.0),
ieta15 = cms.vdouble(1.0, 1.0),
ieta16 = cms.vdouble(1.0, 1.0),
ieta17 = cms.vdouble(1.0, 1.0),
ieta18 = cms.vdouble(1.0, 1.0),
ieta19 = cms.vdouble(1.0, 1.0),
ieta20 = cms.vdouble(1.0, 1.0),
ieta21 = cms.vdouble(1.0, 1.0),
ieta22 = cms.vdouble(1.0, 1.0),
ieta23 = cms.vdouble(1.0, 1.0),
ieta24 = cms.vdouble(1.0, 1.0),
ieta25 = cms.vdouble(1.0, 1.0),
ieta26 = cms.vdouble(1.0, 1.0),
ieta27 = cms.vdouble(1.0, 1.0),
ieta28 = cms.vdouble(1.0, 1.0)
ieta1 = cms.vint32(255, 255),
ieta2 = cms.vint32(255, 255),
ieta3 = cms.vint32(255, 255),
ieta4 = cms.vint32(255, 255),
ieta5 = cms.vint32(255, 255),
ieta6 = cms.vint32(255, 255),
ieta7 = cms.vint32(255, 255),
ieta8 = cms.vint32(255, 255),
ieta9 = cms.vint32(255, 255),
ieta10 = cms.vint32(255, 255),
ieta11 = cms.vint32(255, 255),
ieta12 = cms.vint32(255, 255),
ieta13 = cms.vint32(255, 255),
ieta14 = cms.vint32(255, 255),
ieta15 = cms.vint32(255, 255),
ieta16 = cms.vint32(255, 255),
ieta17 = cms.vint32(255, 255),
ieta18 = cms.vint32(255, 255),
ieta19 = cms.vint32(255, 255),
ieta20 = cms.vint32(255, 255),
ieta21 = cms.vint32(255, 255),
ieta22 = cms.vint32(255, 255),
ieta23 = cms.vint32(255, 255),
ieta24 = cms.vint32(255, 255),
ieta25 = cms.vint32(255, 255),
ieta26 = cms.vint32(255, 255),
ieta27 = cms.vint32(255, 255),
ieta28 = cms.vint32(255, 255)
),

latency = cms.int32(1),
Expand Down