24 const std::vector<double>&
w,
36 uint32_t minSignalThreshold,
37 uint32_t PMT_NoiseThreshold)
54 minSignalThreshold_(minSignalThreshold),
55 PMT_NoiseThreshold_(PMT_NoiseThreshold),
58 peak_finder_algorithm_(2),
59 override_parameters_() {
97 if (
frame.id().depth() == 5)
101 assert(ids.size() == 1 || ids.size() == 2);
104 samples1.setPresamples(
frame.presamples());
107 std::vector<bool> msb;
110 if (ids.size() == 2) {
113 for (
int i = 0;
i < samples1.size(); ++
i) {
114 samples1[
i] = uint32_t(samples1[
i] * 0.5);
115 samples2[
i] = samples1[
i];
117 samples2.setPresamples(
frame.presamples());
126 if (
frame.id().depth() == 1 ||
frame.id().depth() == 2) {
128 std::vector<HcalTrigTowerDetId>::const_iterator it;
129 for (it = ids.begin(); it != ids.end(); ++it) {
142 if (trig_tower_id.
version() == 0) {
144 uint32_t fgid = (
frame.id().maskDepth());
148 theTowerMapFGSum.insert(std::pair<HcalTrigTowerDetId, SumFGContainer>(trig_tower_id, sumFG));
152 SumFGContainer::iterator sumFGItr;
153 for (sumFGItr = sumFG.begin(); sumFGItr != sumFG.end(); ++sumFGItr) {
154 if (sumFGItr->id() == fgid) {
159 if (sumFGItr != sumFG.end()) {
170 sumFG.push_back(sumFGSamples);
175 vector<bool> vetoBits(
samples.size(),
false);
185 else if (trig_tower_id.
version() == 1) {
186 uint32_t fgid = (
frame.id().maskDepth());
189 if (
frame.id().depth() == 1) {
192 }
else if (
frame.id().depth() == 2) {
197 edm::LogWarning(
"HcalTPAlgo") <<
"Unable to figure out what to do with data frame for " <<
frame.id();
216 for (
const auto&
id : ids) {
218 edm::LogError(
"HcalTPAlgo") <<
"Encountered QIE10 data frame mapped to TP version 0:" <<
id;
222 int nsamples =
frame.samples();
239 detail.validity.resize(nsamples);
240 detail.passTDC.resize(nsamples);
242 for (
int idx = 0;
idx < nsamples; ++
idx) {
256 assert(ids.size() == 1 || ids.size() == 2);
259 samples1.setPresamples(
frame.presamples());
262 std::vector<std::bitset<2>> msb(
frame.samples(), 0);
265 if (ids.size() == 2) {
268 for (
int i = 0;
i < samples1.size(); ++
i) {
269 samples1[
i] = uint32_t(samples1[
i]);
270 samples2[
i] = samples1[
i];
272 samples2.setPresamples(
frame.presamples());
284 SumMap::iterator itr =
theSumMap.find(
id);
297 SatMap::iterator itr_sat =
theSatMap.find(
id);
302 vector<bool> check_sat;
305 check_sat.push_back(
true);
307 check_sat.push_back(
false);
309 theSatMap.insert(std::make_pair(
id, check_sat));
313 (itr_sat->second)[
i] =
true;
325 for (
int ibin = 0; ibin <
int(
samples.size()) - shrink; ++ibin) {
326 int algosumvalue = 0;
327 for (
unsigned int i = 0;
i <
weights_.size();
i++) {
331 if (algosumvalue < 0)
336 sum[ibin] = algosumvalue;
340 int dgPresamples =
samples.presamples();
342 int shift = dgPresamples - tpPresamples;
343 int dgSamples =
samples.size();
348 <<
"TP presample or size from the configuration file is out of the accessible range. Using digi values from " 351 tpPresamples = dgPresamples - shrink;
356 std::vector<int> finegrain(tpSamples,
false);
359 output.setPresamples(tpPresamples);
361 for (
int ibin = 0; ibin < tpSamples; ++ibin) {
382 finegrain[ibin] = msb[
idx];
389 finegrain[ibin] = msb[
idx];
402 vector<bool> sample_saturation,
410 unsigned int dgSamples =
samples.size();
411 unsigned int dgPresamples =
samples.presamples();
421 unsigned int shift = dgPresamples - tpPresamples;
424 unsigned int shrink = filterSamples - 1;
433 bool force_saturation[
samples.size()];
435 force_saturation[
i] =
false;
439 for (
unsigned int ibin = 0; ibin < dgSamples - shrink; ++ibin) {
440 int algosumvalue = 0;
441 bool check_sat =
false;
444 for (
unsigned int i = 0;
i < filterSamples;
i++) {
457 int segmentationFactor = 1;
458 if (ids.size() == 2) {
459 segmentationFactor = 2;
462 algosumvalue +=
int(
sample / segmentationFactor);
464 if (algosumvalue < 0)
469 sum[ibin] = algosumvalue;
472 force_saturation[ibin] =
true;
478 int sampleTS =
samples[ibin + 1];
479 int sampleTSminus1 =
samples[ibin];
492 int segmentationFactor = 1;
493 if (ids.size() == 2) {
494 segmentationFactor = 2;
500 algosumvalue = ((sampleTS << 8) - (sampleTSminus1 * theWeight)) / 256 / segmentationFactor;
502 if (algosumvalue < 0)
507 sum[ibin] = algosumvalue;
510 force_saturation[ibin] =
true;
514 std::vector<int> finegrain(tpSamples,
false);
517 output.setPresamples(tpPresamples);
519 for (
unsigned int ibin = 0; ibin < tpSamples; ++ibin) {
522 int idx = ibin +
shift - filterPresamples;
555 finegrain[ibin] = fg_algo.
compute(timingTDC[
idx + filterPresamples], ids[0]).to_ulong() |
556 fg_algo.
compute(msb[
idx + filterPresamples]).to_ulong() << 4;
557 if (ibin == tpPresamples && (
idx + filterPresamples) != dgPresamples)
559 <<
"TP SOI (tpPresamples = " << tpPresamples
560 <<
") is not aligned with digi SOI (dgPresamples = " << dgPresamples <<
")";
567 const int hf_lumi_shift) {
571 int dgPresamples =
samples.presamples();
573 int shift = dgPresamples - tpPresamples;
574 int dgSamples =
samples.size();
576 if (shift < 0 || shift + tpSamples > dgSamples) {
578 <<
"TP presample or size from the configuration file is out of the accessible range. Using digi values from " 580 tpPresamples = dgPresamples;
582 tpSamples = dgSamples;
585 std::vector<int> finegrain(tpSamples,
false);
593 for (SumFGContainer::const_iterator sumFGItr = sumFG.begin(); sumFGItr != sumFG.end(); ++sumFGItr) {
594 const std::vector<bool>&
veto =
HF_Veto[sumFGItr->id().rawId()];
595 for (
int ibin = 0; ibin < tpSamples; ++ibin) {
607 output.setPresamples(tpPresamples);
609 for (
int ibin = 0; ibin < tpSamples; ++ibin) {
613 if (
output[ibin] > MAX_OUTPUT)
614 output[ibin] = MAX_OUTPUT;
621 const int hf_lumi_shift,
642 for (
const auto&
item : it->second) {
645 const int IDX = ibin + SHIFT;
646 int long_fiber_val = 0;
647 if (IDX <
details.long_fiber.size()) {
648 long_fiber_val =
details.long_fiber[IDX];
650 int short_fiber_val = 0;
651 if (IDX <
details.short_fiber.size()) {
652 short_fiber_val =
details.short_fiber[IDX];
654 output[ibin] += (long_fiber_val + short_fiber_val);
656 uint32_t ADCLong =
details.LongDigi[ibin].adc();
657 uint32_t ADCShort =
details.ShortDigi[ibin].adc();
662 if (embit !=
nullptr)
673 std::vector<int> finegrain_converted;
674 finegrain_converted.reserve(finegrain.size());
675 for (
const auto& fg : finegrain)
676 finegrain_converted.push_back(fg.to_ulong());
682 auto adc_threshold =
parameters->getADCThresholdHF();
690 if (digi[ts].
adc() < adc_threshold)
693 return (1ul << digi[ts].le_tdc()) & tdc_mask;
710 const int hf_lumi_shift,
716 assert(hf_lumi_shift >= 2);
732 for (
const auto&
item : it->second) {
737 int long_fiber_val = 0;
738 int long_fiber_count = 0;
739 int short_fiber_val = 0;
740 int short_fiber_count = 0;
742 bool saturated =
false;
744 for (
auto i : {0, 2}) {
751 for (
auto i : {1, 3}) {
766 if (long_fiber_count == 2)
767 long_fiber_val >>= 1;
768 if (short_fiber_count == 2)
769 short_fiber_val >>= 1;
771 auto sum = long_fiber_val + short_fiber_val;
775 if (long_fiber_count > 0 and short_fiber_count > 0)
786 finegrain[ibin][1] = finegrain[ibin][1]
or detail.fgbits[
idx][0];
790 finegrain[ibin][0] = finegrain[ibin][0]
or detail.fgbits[
idx][1];
811 std::vector<int> finegrain_converted;
812 finegrain_converted.reserve(finegrain.size());
813 for (
const auto& fg : finegrain)
814 finegrain_converted.push_back(fg.to_ulong());
821 for (
int i = 0;
i <
tp->size(); ++
i) {
828 tp->setZSInfo(
false,
true);
830 tp->setZSInfo(
true,
false);
837 std::set<uint32_t> FrontEndErrors;
857 for (
int fchan = 0; fchan < 3 && !
valid; fchan++) {
858 for (
int fib = 0; fib < 9 && !
valid; fib++) {
868 for (std::vector<HcalTrigTowerDetId>::const_iterator triggerId = ids.begin(); triggerId != ids.end();
870 FrontEndErrors.insert(triggerId->rawId());
883 if (FrontEndErrors.find(
tp->id().rawId()) != FrontEndErrors.end()) {
884 for (
int i = 0;
i <
tp->size(); ++
i)
885 tp->setSample(
i, zeroSample);
891 FGbitMap::iterator itr =
fgMap_.find(
id);
892 if (itr !=
fgMap_.end()) {
893 std::vector<bool>& _msb = itr->second;
894 for (
size_t i = 0;
i < msb.size(); ++
i)
895 _msb[
i] = _msb[
i] || msb[
i];
923 unsigned int aieta =
id.ietaAbs();
934 std::vector<bool> pseudo(
bits.size(),
false);
943 element.resize(
bits.size());
954 element.resize(
bits.size());
955 it =
fgUpgradeMap_.insert(std::make_pair(
id, element)).first;
957 for (
unsigned int i = 0;
i <
bits.size(); ++
i) {
969 assert(ids.size() == 1 || ids.size() == 2);
971 samples1.setPresamples(
frame.presamples());
975 bool is_compressed =
false;
977 is_compressed = (
frame.flavor() == 3);
984 element.resize(
frame.samples());
987 for (
int i = 0;
i <
frame.samples();
i++) {
988 it->second[
i][detId.depth() - 1] =
989 std::make_pair(std::make_pair(bits12_15[
i], is_compressed), std::make_pair(
frame[
i].tdc(), samples1[
i]));
995 std::vector<std::string> ietaStrs =
weightsQIE11.getParameterNames();
996 for (
auto& ietaStr : ietaStrs) {
998 auto const&
v =
weightsQIE11.getParameter<std::vector<int>>(ietaStr);
1010 if (algo <= 0 || algo > 2)
1011 throw cms::Exception(
"ERROR: Only algo 1 & 2 are supported.") << std::endl;
bool validUpgradeFG(const HcalTrigTowerDetId &id, int depth) const
void addUpgradeTDCFG(const HcalTrigTowerDetId &id, const QIE11DataFrame &frame)
void analyze(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result)
adds the actual digis
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
void runFEFormatError(const FEDRawDataCollection *rawraw, const HcalElectronicsMap *emap, HcalTrigPrimDigiCollection &result)
T getParameter(std::string const &) const
std::vector< uint32_t > FG_HF_thresholds_
HFUpgradeDetailMap theHFUpgradeDetailMap
constexpr edm::DataFrame::id_type id() const
void analyzeHF(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result, const int hf_lumi_shift)
bool useTDCInMinBiasBits_
static const int QIE10_MAX_LINEARIZATION_ET
uint32_t getMask() const
get mask for channel validity and self trigger information
void analyzeHF2016(const IntegerCaloSamples &SAMPLES, HcalTriggerPrimitiveDigi &result, const int HF_LUMI_SHIFT, const HcalFeatureBit *HCALFEM)
constexpr int ietaAbs() const
get the absolute value of the cell ieta
static const int FIRST_DEPTH7_TOWER
int peak_finder_algorithm_
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void analyzeHFQIE10(const IntegerCaloSamples &SAMPLES, HcalTriggerPrimitiveDigi &result, const int HF_LUMI_SHIFT, const HcalFeatureBit *HCALFEM)
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
static const int LAST_FINEGRAIN_TOWER
bool needLegacyFG(const HcalTrigTowerDetId &id) const
static const int QIE10_LINEARIZATION_ET
const HcalTPGCompressor * outcoder_
size_t size() const
Lenght of the data buffer in bytes.
static const int LAST_FINEGRAIN_DEPTH
void lookupMSB(const HBHEDataFrame &df, std::vector< bool > &msb) const
void setPresamples(int pre)
set presample information
void addFG(const HcalTrigTowerDetId &id, std::vector< bool > &msb)
std::vector< unsigned short > group0FGbits(const QIE11DataFrame &df) const
Log< level::Error, false > LogError
static const int HBHE_OVERLAP_TOWER
constexpr Detector det() const
get the detector field from this detid
std::array< std::array< int, 2 >, 29 > weightsQIE11_
numberOfFilterPresamplesHEQIE11
TowerMapFGSum theTowerMapFGSum
const HcalTopology & topology() const
uint32_t minSignalThreshold_
constexpr bool null() const
is this a null id ?
static const int FIRST_FINEGRAIN_TOWER
constexpr HcalSubdetector subdet() const
get the subdetector
std::vector< IntegerCaloSamples > SumFGContainer
void compress(const IntegerCaloSamples &ics, const std::vector< int > &fineGrain, HcalTriggerPrimitiveDigi &digi) const
const HcalTrigTowerGeometry * theTrigTowerGeometry
const HcalDbService * conditions_
weightsQIE11
hardware algo
unsigned int htrSlot() const
HcalElectronicsId-style HTR slot.
unsigned int htrTopBottom() const
HcalElectronicsId-style HTR top/bottom (1=top/0=bottom)
numberOfFilterPresamplesHBQIE11
static const int QIE11_LINEARIZATION_ET
void setWeightQIE11(int aieta, int weight)
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
bool needUpgradeID(const HcalTrigTowerDetId &id, int depth) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::vector< double > weights_
const HcalTPChannelParameter * getHcalTPChannelParameter(const HcalGenericDetId &fId, bool throwOnFail=true) const
int numberOfPresamplesHF_
const HcalTPParameters * getHcalTPParameters() const
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
void runZS(HcalTrigPrimDigiCollection &tp)
std::vector< T >::iterator iterator
constexpr bool linkError() const
void analyzeQIE11(IntegerCaloSamples &samples, std::vector< bool > sample_saturation, HcalTriggerPrimitiveDigi &result, const HcalFinegrainBit &fg_algo)
Log< level::Info, false > LogInfo
std::vector< HcalFinegrainBit::TowerTDC > FGUpgradeTDCContainer
std::vector< HcalFinegrainBit::Tower > FGUpgradeContainer
std::bitset< 2 > compute(const Tower &) const
void setNCTScaleShift(int)
virtual bool fineGrainbit(const QIE10DataFrame &short1, const QIE10DataFrame &short2, const QIE10DataFrame &long1, const QIE10DataFrame &long2, bool validShort1, bool validShort2, bool validLong1, bool validLong2, int idx) const =0
uint32_t override_adc_hf_value_
uint32_t PMT_NoiseThreshold_
unsigned long long override_tdc_hf_value_
static const int QIE11_MAX_LINEARIZATION_ET
void adc2Linear(const HBHEDataFrame &df, IntegerCaloSamples &ics) const override
void addUpgradeFG(const HcalTrigTowerDetId &id, int depth, const std::vector< std::bitset< 2 >> &bits)
FGUpgradeTDCMap fgUpgradeTDCMap_
const HcaluLUTTPGCoder * incoder_
unsigned int getErrorsWord() const
Get the errors word.
HcalTriggerPrimitiveAlgo(bool pf, const std::vector< double > &w, int latency, uint32_t FG_threshold, const std::vector< uint32_t > &FG_HF_thresholds, uint32_t ZS_threshold, int numberOfSamples, int numberOfPresamples, int numberOfFilterPresamplesHBQIE11, int numberOfFilterPresamplesHEQIE11, int numberOfSamplesHF, int numberOfPresamplesHF, bool useTDCInMinBiasBits, uint32_t minSignalThreshold=0, uint32_t PMT_NoiseThreshold=0)
static const int QIE8_LINEARIZATION_ET
HFDetailMap theHFDetailMap
static unsigned int const shift
bool passTDC(const QIE10DataFrame &digi, int ts) const
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
unsigned int readoutVMECrateId() const
HcalElectronicsId-style VME crate number.
bool validChannel(const QIE10DataFrame &digi, int ts) const
Log< level::Warning, false > LogWarning
int version() const
get the version code for the trigger tower
void setRCTScaleShift(int)
int numberOfFilterPresamplesHEQIE11_
edm::ParameterSet override_parameters_
Readout chain identification for Hcal.
FGUpgradeMap fgUpgradeMap_
void addSignal(const HBHEDataFrame &frame)
adds the signal to the map
std::vector< HcalTrigTowerDetId > towerIds(const HcalDetId &cellId) const
the mapping to and from DetIds
void setUpgradeFlags(bool hb, bool he, bool hf)
void overrideParameters(const edm::ParameterSet &ps)
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
void setWeightsQIE11(const edm::ParameterSet &weightsQIE11)
~HcalTriggerPrimitiveAlgo()
constexpr int samples() const
total number of samples in the digi
void setPeakFinderAlgorithm(int algo)
uint16_t *__restrict__ uint16_t const *__restrict__ adc
void setFixSaturationFlag(bool fix_saturation)
int numberOfFilterPresamplesHBQIE11_