18 template <
class Coll,
class DetIdClass>
26 typename Coll::const_iterator
i =
pt->find(DetIdClass(did));
28 isUS =
i->zsUnsuppressed();
29 isMP =
i->zsMarkAndPass();
32 for (
int j = 0;
j <
size;
j++) {
47 bool any_nonzero =
false;
52 for (
int j = 0;
j <
size;
j++) {
61 return (any_nonzero) ? (
size) : (0);
111 static const int HTRFormatVersion = 5;
116 for (
int spigot = 0; spigot < 15; spigot++) {
117 spigots[spigot].
allocate(HTRFormatVersion);
121 bool haveUnsuppressed =
false;
122 for (
int fiber = 1; fiber <= 8; fiber++) {
123 for (
int fiberchan = 0; fiberchan < 3; fiberchan++) {
124 int linear = (fiber - 1) * 3 + fiberchan;
125 HcalQIESample chanSample(0, 0, fiber, fiberchan,
false,
false);
126 unsigned short chanid = chanSample.
raw() & 0xF800;
128 channelIsMP[
linear] =
false;
134 if (!emap.
lookup(partialEid, fullEid, genId)) {
140 int mypresamples = -1;
141 bool isUS =
false, isMP =
false;
143 haveUnsuppressed = haveUnsuppressed || isUS;
144 channelIsMP[
linear] = isMP;
149 }
else if (
samples != mysamples) {
150 edm::LogError(
"HCAL") <<
"Mismatch of samples in a single HTR (unsupported) " << mysamples
156 exampleEId = fullEid;
158 edm::LogError(
"HCAL") <<
"Mismatch of presamples in a single HTR (unsupported) " << mypresamples
163 database[
ii] = (database[
ii] & 0x7FF) | chanid;
171 for (
int slbchan = 0; slbchan <= 3; slbchan++) {
174 unsigned short chanid = idCvt.
raw() & 0xF800;
181 if (!emap.
lookup(partialEid, fullEid, tid)) {
189 exampleEId = fullEid;
197 for (
unsigned char q = 0;
q < triglen[
linear];
q++) {
198 trigbase[
q] = (trigbase[
q] & 0x7FF) | chanid;
205 spigots[spigot].
pack(&(preclen[0]), &(precdata[0]), &(triglen[0]), &(trigdata[0]),
false);
206 static const int pipeline = 0x22;
207 static const int firmwareRev = 0;
209 submodule |= (exampleEId.
htrSlot() & 0x1F) << 1;
228 if (haveUnsuppressed) {
235 for (
int spigot = 0; spigot < 15; spigot++) {
236 theSize += spigots[spigot].
getRawLength() *
sizeof(
unsigned short);
239 theSize += (8 - (theSize % 8)) % 8;
245 dcc->setHeader(
fedid, bcn, nl1a, orbitn);
248 for (
int spigot = 0; spigot < 15; spigot++) {
249 if (spigots[spigot].getRawLength() > 0) {
250 dcc->copySpigotData(spigot, spigots[spigot],
true, 0);
constexpr int32_t htrSlot() const
get the htr slot
ALPAKA_FN_ACC int dcc(int ieta, int iphi)
static int slb(const HcalTriggerPrimitiveSample &theSample)
void packUnsuppressed(const bool *mp)
pack trailer with Mark and Pass bits
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
std::vector< T >::const_iterator const_iterator
const HcalCalibDigiCollection * calibCont
constexpr int32_t htrTopBottom() const
get the htr top/bottom (1=top/0=bottom), valid for VME
static const int CHANNELS_PER_SPIGOT
Log< level::Error, false > LogError
static const int MAXIMUM_SAMPLES_PER_CHANNEL
constexpr Detector det() const
get the detector field from this detid
void allocate(int version_to_create=0)
constexpr bool null() const
is this a null id ?
constexpr int32_t readoutVMECrateId() const
get the readout VME crate number
uint16_t raw() const
get the raw word
static void set(unsigned char *trailer, uint32_t lenght, uint16_t crc, uint8_t evt_stat, uint8_t tts, bool moreTrailers=false)
Set all fields in the trailer.
static unsigned char processTrig(const HcalTrigPrimDigiCollection *pt, const HcalTrigTowerDetId &tid, unsigned short *buffer)
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
void pack(int fedid, int dccnumber, int nl1a, int orbitn, int bcn, const Collections &inputs, const HcalElectronicsMap &emap, FEDRawData &output) const
const HcalTrigPrimDigiCollection * tpCont
const ZDCDigiCollection * zdcCont
int findSamples(const DetId &did, const Collections &inputs, unsigned short *buffer, int &presamples, bool &zsUS, bool &zsMP) const
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const HBHEDigiCollection * hbhe
HcalGenericSubdetector genericSubdet() const
constexpr uint16_t raw() const
get the raw word
void pack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples, bool do_capid=false)
Unpack the HTR data into TP and DAQ data sorted by channel.
int process(const Coll *pt, const DetId &did, unsigned short *buffer, int &presamples, bool &isUS, bool &isMP)
void packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev=0, int firmwareFlav=0)
pack header and trailer (call after pack)
const HODigiCollection * hoCont
const HFDigiCollection * hfCont
static constexpr int32_t SubdetectorId
const int getRawLength() const
Get the length of the raw data.
Readout chain identification for Hcal.