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

[HGCal trigger] Use ADC/TDC for scintillator #28495

Merged
merged 1 commit into from Nov 28, 2019
Merged
Show file tree
Hide file tree
Changes from all 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 @@ -19,16 +19,26 @@ class HGCalVFELinearizationImpl {
uint32_t linnBits() const { return linnBits_; }

private:
double adcLSB_;
double linLSB_;
double adcsaturation_;
uint32_t tdcnBits_;
double tdcOnsetfC_;
uint32_t adcnBits_;
double tdcsaturation_;
uint32_t linnBits_;
double tdcLSB_;
double adcLSB_si_;
double linLSB_si_;
double adcsaturation_si_;
uint32_t tdcnBits_si_;
double tdcOnset_si_;
uint32_t adcnBits_si_;
double tdcsaturation_si_;
double tdcLSB_si_;
//
double adcLSB_sc_;
double linLSB_sc_;
double adcsaturation_sc_;
uint32_t tdcnBits_sc_;
double tdcOnset_sc_;
uint32_t adcnBits_sc_;
double tdcsaturation_sc_;
double tdcLSB_sc_;
//
uint32_t linMax_;
uint32_t linnBits_;
};

#endif
42 changes: 27 additions & 15 deletions L1Trigger/L1THGCal/python/hgcalVFEProducer_cfi.py
Expand Up @@ -8,14 +8,18 @@
import RecoLocalCalo.HGCalRecProducers.HGCalRecHit_cfi as recocalibparam
from . import hgcalLayersCalibrationCoefficients_cfi as layercalibparam

# Digitization parameters
adcSaturation_fC = digiparam.hgceeDigitizer.digiCfg.feCfg.adcSaturation_fC
adcNbits = digiparam.hgceeDigitizer.digiCfg.feCfg.adcNbits
tdcSaturation_fC = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcSaturation_fC
tdcNbits = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcNbits
tdcOnset_fC = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcOnset_fC
adcSaturationBH_MIP = digiparam.hgchebackDigitizer.digiCfg.feCfg.adcSaturation_fC
adcNbitsBH = digiparam.hgchebackDigitizer.digiCfg.feCfg.adcNbits
# Silicon Digitization parameters
adcSaturation_si = digiparam.hgceeDigitizer.digiCfg.feCfg.adcSaturation_fC
adcNbits_si = digiparam.hgceeDigitizer.digiCfg.feCfg.adcNbits
tdcSaturation_si = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcSaturation_fC
tdcNbits_si = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcNbits
tdcOnset_si = digiparam.hgceeDigitizer.digiCfg.feCfg.tdcOnset_fC
# Scintillator Digitization parameters
adcSaturation_sc = digiparam.hgchebackDigitizer.digiCfg.feCfg.adcSaturation_fC
adcNbits_sc = digiparam.hgchebackDigitizer.digiCfg.feCfg.adcNbits
tdcSaturation_sc = digiparam.hgchebackDigitizer.digiCfg.feCfg.tdcSaturation_fC
tdcNbits_sc = digiparam.hgchebackDigitizer.digiCfg.feCfg.tdcNbits
tdcOnset_sc = digiparam.hgchebackDigitizer.digiCfg.feCfg.tdcOnset_fC

# Reco calibration parameters
fCPerMIPee = recoparam.HGCalUncalibRecHit.HGCEEConfig.fCPerMIP
Expand All @@ -35,15 +39,23 @@
triggerCellTruncationBits = 0

vfe_proc = cms.PSet( ProcessorName = cms.string('HGCalVFEProcessorSums'),
linLSB = cms.double(triggerCellLsbBeforeCompression),
adcsaturation = adcSaturation_fC,
tdcnBits = tdcNbits,
tdcOnsetfC = tdcOnset_fC,
adcnBits = adcNbits,
tdcsaturation = tdcSaturation_fC,
# Silicon digi parameters
linLSB_si = cms.double(triggerCellLsbBeforeCompression),
adcsaturation_si = adcSaturation_si,
tdcnBits_si = tdcNbits_si,
tdcOnset_si = tdcOnset_si,
adcnBits_si = adcNbits_si,
tdcsaturation_si = tdcSaturation_si,
# Scintillator digi parameters
linLSB_sc = cms.double(float(adcSaturation_sc.value())/(2**float(adcNbits_sc.value()))),
adcsaturation_sc = adcSaturation_sc,
tdcnBits_sc = tdcNbits_sc,
tdcOnset_sc = tdcOnset_sc,
adcnBits_sc = adcNbits_sc,
tdcsaturation_sc = tdcSaturation_sc,
linnBits = cms.uint32(16),
siliconCellLSB_fC = cms.double( triggerCellLsbBeforeCompression*(2**triggerCellTruncationBits) ),
scintillatorCellLSB_MIP = cms.double(float(adcSaturationBH_MIP.value())/(2**float(adcNbitsBH.value()))),
scintillatorCellLSB_MIP = cms.double(float(adcSaturation_sc.value())/(2**float(adcNbits_sc.value()))),
noiseSilicon = cms.PSet(),
noiseScintillator = cms.PSet(),
# cell thresholds before TC sums
Expand Down
52 changes: 35 additions & 17 deletions L1Trigger/L1THGCal/src/veryfrontend/HGCalVFELinearizationImpl.cc
@@ -1,15 +1,23 @@
#include "L1Trigger/L1THGCal/interface/veryfrontend/HGCalVFELinearizationImpl.h"

HGCalVFELinearizationImpl::HGCalVFELinearizationImpl(const edm::ParameterSet& conf)
: linLSB_(conf.getParameter<double>("linLSB")),
adcsaturation_(conf.getParameter<double>("adcsaturation")),
tdcnBits_(conf.getParameter<uint32_t>("tdcnBits")),
tdcOnsetfC_(conf.getParameter<double>("tdcOnsetfC")),
adcnBits_(conf.getParameter<uint32_t>("adcnBits")),
tdcsaturation_(conf.getParameter<double>("tdcsaturation")),
: linLSB_si_(conf.getParameter<double>("linLSB_si")),
adcsaturation_si_(conf.getParameter<double>("adcsaturation_si")),
tdcnBits_si_(conf.getParameter<uint32_t>("tdcnBits_si")),
tdcOnset_si_(conf.getParameter<double>("tdcOnset_si")),
adcnBits_si_(conf.getParameter<uint32_t>("adcnBits_si")),
tdcsaturation_si_(conf.getParameter<double>("tdcsaturation_si")),
linLSB_sc_(conf.getParameter<double>("linLSB_sc")),
adcsaturation_sc_(conf.getParameter<double>("adcsaturation_sc")),
tdcnBits_sc_(conf.getParameter<uint32_t>("tdcnBits_sc")),
tdcOnset_sc_(conf.getParameter<double>("tdcOnset_sc")),
adcnBits_sc_(conf.getParameter<uint32_t>("adcnBits_sc")),
tdcsaturation_sc_(conf.getParameter<double>("tdcsaturation_sc")),
linnBits_(conf.getParameter<uint32_t>("linnBits")) {
adcLSB_ = adcsaturation_ / pow(2., adcnBits_);
tdcLSB_ = tdcsaturation_ / pow(2., tdcnBits_);
adcLSB_si_ = adcsaturation_si_ / pow(2., adcnBits_si_);
fabiocos marked this conversation as resolved.
Show resolved Hide resolved
tdcLSB_si_ = tdcsaturation_si_ / pow(2., tdcnBits_si_);
adcLSB_sc_ = adcsaturation_sc_ / pow(2., adcnBits_sc_);
tdcLSB_sc_ = tdcsaturation_sc_ / pow(2., tdcnBits_sc_);
linMax_ = (0x1 << linnBits_) - 1;
}

Expand All @@ -21,18 +29,28 @@ void HGCalVFELinearizationImpl::linearize(const std::vector<HGCDataFrame<DetId,

for (const auto& frame : dataframes) { //loop on DIGI
unsigned det = frame.id().det();
double adcLSB = 0.;
double tdcLSB = 0.;
double tdcOnset = 0.;
double linLSB = 0.;
if (det == DetId::Forward || det == DetId::HGCalEE || det == DetId::HGCalHSi) {
if (frame[kIntimeSample].mode()) { //TOT mode
amplitude = (floor(tdcOnsetfC_ / adcLSB_) + 1.0) * adcLSB_ + double(frame[kIntimeSample].data()) * tdcLSB_;
} else { //ADC mode
amplitude = double(frame[kIntimeSample].data()) * adcLSB_;
}

amplitude_int = uint32_t(floor(amplitude / linLSB_ + 0.5));
adcLSB = adcLSB_si_;
tdcLSB = tdcLSB_si_;
tdcOnset = tdcOnset_si_;
linLSB = linLSB_si_;
} else if (det == DetId::Hcal || det == DetId::HGCalHSc) {
// no linearization here. Take the raw ADC data
amplitude_int = frame[kIntimeSample].data();
adcLSB = adcLSB_sc_;
tdcLSB = tdcLSB_sc_;
tdcOnset = tdcOnset_sc_;
linLSB = linLSB_sc_;
}
if (frame[kIntimeSample].mode()) { //TOT mode
amplitude = (floor(tdcOnset / adcLSB) + 1.0) * adcLSB + double(frame[kIntimeSample].data()) * tdcLSB;
} else { //ADC mode
amplitude = double(frame[kIntimeSample].data()) * adcLSB;
}

amplitude_int = uint32_t(floor(amplitude / linLSB + 0.5));
if (amplitude_int > linMax_)
amplitude_int = linMax_;

Expand Down