|
|
Go to the documentation of this file.
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;
442 for (
unsigned int i = 0;
i < filterSamples;
i++) {
454 double segmentationFactor = 1.0;
455 if (ids.size() == 2) {
456 segmentationFactor = 0.5;
462 algosumvalue +=
int(
sample * segmentationFactor * theWeight);
464 if (algosumvalue < 0)
469 sum[ibin] = algosumvalue;
472 force_saturation[ibin] =
true;
475 std::vector<int> finegrain(tpSamples,
false);
478 output.setPresamples(tpPresamples);
480 for (
unsigned int ibin = 0; ibin < tpSamples; ++ibin) {
483 int idx = ibin +
shift - filterPresamples;
503 finegrain[ibin] = fg_algo.
compute(timingTDC[
idx], ids[0]).to_ulong() | fg_algo.
compute(msb[
idx]).to_ulong() << 1;
510 const int hf_lumi_shift) {
514 int dgPresamples =
samples.presamples();
516 int shift = dgPresamples - tpPresamples;
517 int dgSamples =
samples.size();
519 if (shift < 0 || shift + tpSamples > dgSamples) {
521 <<
"TP presample or size from the configuration file is out of the accessible range. Using digi values from "
523 tpPresamples = dgPresamples;
525 tpSamples = dgSamples;
528 std::vector<int> finegrain(tpSamples,
false);
536 for (SumFGContainer::const_iterator sumFGItr = sumFG.begin(); sumFGItr != sumFG.end(); ++sumFGItr) {
537 const std::vector<bool>&
veto =
HF_Veto[sumFGItr->id().rawId()];
538 for (
int ibin = 0; ibin < tpSamples; ++ibin) {
550 output.setPresamples(tpPresamples);
552 for (
int ibin = 0; ibin < tpSamples; ++ibin) {
556 if (
output[ibin] > MAX_OUTPUT)
557 output[ibin] = MAX_OUTPUT;
564 const int hf_lumi_shift,
585 for (
const auto&
item : it->second) {
588 const int IDX = ibin + SHIFT;
589 int long_fiber_val = 0;
590 if (IDX <
details.long_fiber.size()) {
591 long_fiber_val =
details.long_fiber[IDX];
593 int short_fiber_val = 0;
594 if (IDX <
details.short_fiber.size()) {
595 short_fiber_val =
details.short_fiber[IDX];
597 output[ibin] += (long_fiber_val + short_fiber_val);
599 uint32_t ADCLong =
details.LongDigi[ibin].adc();
600 uint32_t ADCShort =
details.ShortDigi[ibin].adc();
605 if (embit !=
nullptr)
616 std::vector<int> finegrain_converted;
617 finegrain_converted.reserve(finegrain.size());
618 for (
const auto& fg : finegrain)
619 finegrain_converted.push_back(fg.to_ulong());
625 auto adc_threshold =
parameters->getADCThresholdHF();
633 if (digi[ts].
adc() < adc_threshold)
636 return (1ul << digi[ts].le_tdc()) & tdc_mask;
653 const int hf_lumi_shift,
659 assert(hf_lumi_shift >= 2);
675 for (
const auto&
item : it->second) {
680 int long_fiber_val = 0;
681 int long_fiber_count = 0;
682 int short_fiber_val = 0;
683 int short_fiber_count = 0;
685 bool saturated =
false;
687 for (
auto i : {0, 2}) {
694 for (
auto i : {1, 3}) {
709 if (long_fiber_count == 2)
710 long_fiber_val >>= 1;
711 if (short_fiber_count == 2)
712 short_fiber_val >>= 1;
714 auto sum = long_fiber_val + short_fiber_val;
718 if (long_fiber_count > 0 and short_fiber_count > 0)
729 finegrain[ibin][1] = finegrain[ibin][1]
or detail.fgbits[
idx][0];
733 finegrain[ibin][0] = finegrain[ibin][0]
or detail.fgbits[
idx][1];
754 std::vector<int> finegrain_converted;
755 finegrain_converted.reserve(finegrain.size());
756 for (
const auto& fg : finegrain)
757 finegrain_converted.push_back(fg.to_ulong());
764 for (
int i = 0;
i <
tp->size(); ++
i) {
771 tp->setZSInfo(
false,
true);
773 tp->setZSInfo(
true,
false);
780 std::set<uint32_t> FrontEndErrors;
800 for (
int fchan = 0; fchan < 3 && !
valid; fchan++) {
801 for (
int fib = 0; fib < 9 && !
valid; fib++) {
811 for (std::vector<HcalTrigTowerDetId>::const_iterator triggerId = ids.begin(); triggerId != ids.end();
813 FrontEndErrors.insert(triggerId->rawId());
826 if (FrontEndErrors.find(
tp->id().rawId()) != FrontEndErrors.end()) {
827 for (
int i = 0;
i <
tp->size(); ++
i)
828 tp->setSample(
i, zeroSample);
834 FGbitMap::iterator itr =
fgMap_.find(
id);
835 if (itr !=
fgMap_.end()) {
836 std::vector<bool>& _msb = itr->second;
837 for (
size_t i = 0;
i < msb.size(); ++
i)
838 _msb[
i] = _msb[
i] || msb[
i];
866 unsigned int aieta =
id.ietaAbs();
877 std::vector<bool> pseudo(bits.size(),
false);
886 element.resize(bits.size());
897 element.resize(bits.size());
898 it =
fgUpgradeMap_.insert(std::make_pair(
id, element)).first;
900 for (
unsigned int i = 0;
i < bits.size(); ++
i) {
901 it->second[
i][0][
depth - 1] = bits[
i][0];
902 it->second[
i][1][
depth - 1] = bits[
i][1];
912 assert(ids.size() == 1 || ids.size() == 2);
914 samples1.setPresamples(
frame.presamples());
920 element.resize(
frame.samples());
923 for (
int i = 0;
i <
frame.samples();
i++) {
924 it->second[
i][detId.depth() - 1] = std::make_pair(samples1[
i],
frame[
i].tdc());
930 std::vector<std::string> ietaStrs =
weightsQIE11.getParameterNames();
931 for (
auto& ietaStr : ietaStrs) {
933 auto const&
v =
weightsQIE11.getParameter<std::vector<double>>(ietaStr);
945 if (algo <= 0 || algo > 2)
946 throw cms::Exception(
"ERROR: Only algo 1 & 2 are supported.") << std::endl;
unsigned int readoutVMECrateId() const
HcalElectronicsId-style VME crate number.
void addFG(const HcalTrigTowerDetId &id, std::vector< bool > &msb)
std::vector< HcalTrigTowerDetId > towerIds(const HcalDetId &cellId) const
the mapping to and from DetIds
std::array< std::array< double, 2 >, 29 > weightsQIE11_
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
void overrideParameters(const edm::ParameterSet &ps)
uint32_t override_adc_hf_value_
constexpr int samples() const
total number of samples in the digi
uint16_t *__restrict__ uint16_t const *__restrict__ adc
void setUpgradeFlags(bool hb, bool he, bool hf)
constexpr bool linkError() const
void setWeightsQIE11(const edm::ParameterSet &weightsQIE11)
constexpr Detector det() const
get the detector field from this detid
std::vector< HcalFinegrainBit::TowerTDC > FGUpgradeTDCContainer
static const int FIRST_FINEGRAIN_TOWER
void addUpgradeFG(const HcalTrigTowerDetId &id, int depth, const std::vector< std::bitset< 2 >> &bits)
std::bitset< 2 > compute(const Tower &) const
const HcalDbService * conditions_
uint32_t getMask() const
get mask for channel validity and self trigger information
std::vector< HcalFinegrainBit::Tower > FGUpgradeContainer
constexpr bool null() const
is this a null id ?
void setNCTScaleShift(int)
void compress(const IntegerCaloSamples &ics, const std::vector< int > &fineGrain, HcalTriggerPrimitiveDigi &digi) const
Log< level::Info, false > LogInfo
FGUpgradeTDCMap fgUpgradeTDCMap_
unsigned long long override_tdc_hf_value_
unsigned int htrSlot() const
HcalElectronicsId-style HTR slot.
static const int QIE11_MAX_LINEARIZATION_ET
Log< level::Warning, false > LogWarning
void setWeightQIE11(int aieta, double weight)
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
void setRCTScaleShift(int)
weightsQIE11
hardware algo
static const int QIE10_MAX_LINEARIZATION_ET
static const int LAST_FINEGRAIN_TOWER
bool passTDC(const QIE10DataFrame &digi, int ts) const
void addSignal(const HBHEDataFrame &frame)
adds the signal to the map
unsigned int htrTopBottom() const
HcalElectronicsId-style HTR top/bottom (1=top/0=bottom)
void analyzeQIE11(IntegerCaloSamples &samples, std::vector< bool > sample_saturation, HcalTriggerPrimitiveDigi &result, const HcalFinegrainBit &fg_algo)
int numberOfFilterPresamplesHEQIE11_
static const int QIE10_LINEARIZATION_ET
Readout chain identification for Hcal.
FGUpgradeMap fgUpgradeMap_
void runZS(HcalTrigPrimDigiCollection &tp)
int version() const
get the version code for the trigger tower
const HcalTPParameters * getHcalTPParameters() const
~HcalTriggerPrimitiveAlgo()
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum)
void setFixSaturationFlag(bool fix_saturation)
bool validUpgradeFG(const HcalTrigTowerDetId &id, int depth) const
edm::ParameterSet override_parameters_
int numberOfFilterPresamplesHBQIE11_
uint32_t minSignalThreshold_
static const int HBHE_OVERLAP_TOWER
bool exists(std::string const ¶meterName) const
checks if a parameter exists
uint32_t PMT_NoiseThreshold_
void addUpgradeTDCFG(const HcalTrigTowerDetId &id, const QIE11DataFrame &frame)
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
HFUpgradeDetailMap theHFUpgradeDetailMap
const HcalTrigTowerGeometry * theTrigTowerGeometry
std::vector< T >::iterator iterator
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)
void analyzeHF(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result, const int hf_lumi_shift)
const HcalTopology & topology() const
constexpr HcalSubdetector subdet() const
get the subdetector
void lookupMSB(const HBHEDataFrame &df, std::vector< bool > &msb) const
numberOfFilterPresamplesHBQIE11
void analyzeHFQIE10(const IntegerCaloSamples &SAMPLES, HcalTriggerPrimitiveDigi &result, const int HF_LUMI_SHIFT, const HcalFeatureBit *HCALFEM)
bool needLegacyFG(const HcalTrigTowerDetId &id) const
bool needUpgradeID(const HcalTrigTowerDetId &id, int depth) const
static const int FIRST_DEPTH7_TOWER
HFDetailMap theHFDetailMap
numberOfFilterPresamplesHEQIE11
Log< level::Error, false > LogError
bool validChannel(const QIE10DataFrame &digi, int ts) const
size_t size() const
Lenght of the data buffer in bytes.
static const int LAST_FINEGRAIN_DEPTH
int numberOfPresamplesHF_
int peak_finder_algorithm_
void setPeakFinderAlgorithm(int algo)
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
static unsigned const int shift
const HcalTPGCompressor * outcoder_
const HcalTPChannelParameter * getHcalTPChannelParameter(const HcalGenericDetId &fId, bool throwOnFail=true) const
void setPresamples(int pre)
set presample information
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
T getParameter(std::string const &) const
void runFEFormatError(const FEDRawDataCollection *rawraw, const HcalElectronicsMap *emap, HcalTrigPrimDigiCollection &result)
void analyze(IntegerCaloSamples &samples, HcalTriggerPrimitiveDigi &result)
adds the actual digis
constexpr int ietaAbs() const
get the absolute value of the cell ieta
TowerMapFGSum theTowerMapFGSum
bool useTDCInMinBiasBits_
std::vector< uint32_t > FG_HF_thresholds_
constexpr edm::DataFrame::id_type id() const
void analyzeHF2016(const IntegerCaloSamples &SAMPLES, HcalTriggerPrimitiveDigi &result, const int HF_LUMI_SHIFT, const HcalFeatureBit *HCALFEM)
unsigned int getErrorsWord() const
Get the errors word.
std::vector< IntegerCaloSamples > SumFGContainer
void adc2Linear(const HBHEDataFrame &df, IntegerCaloSamples &ics) const override
static const int QIE11_LINEARIZATION_ET
static const int QIE8_LINEARIZATION_ET
std::vector< double > weights_
const HcaluLUTTPGCoder * incoder_
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event.