18 template <
class Coll,
class DetIdClass>
19 int process(
const Coll* pt,
const DetId& did,
unsigned short* buffer,
int& presamples,
bool& isUS,
bool& isMP) {
20 isUS=
false; isMP=
false;
23 typename Coll::const_iterator
i=pt->find(DetIdClass(did));
25 isUS=i->zsUnsuppressed();
26 isMP=i->zsMarkAndPass();
27 presamples=i->presamples();
30 buffer[
j]=(*i)[
j].raw();
40 int presamples=i->presamples();
41 int samples=i->size();
43 for (
int j=0;
j<samples;
j++) {
44 buffer[
j]=(*i)[
j].raw();
45 if (
j==presamples) buffer[
j]|=0x0200;
52 unsigned short* buffer,
int &presamples,
bool& isUS,
bool& isMP) {
60 size=process<HBHEDigiCollection,HcalDetId>(inputs.
hbhe,did,buffer,presamples,isUS,isMP);
63 size=process<HODigiCollection,HcalDetId>(inputs.
hoCont,did,buffer,presamples,isUS,isMP);
66 size=process<HFDigiCollection,HcalDetId>(inputs.
hfCont,did,buffer,presamples,isUS,isMP);
69 size=process<ZDCDigiCollection,HcalZDCDetId>(inputs.
zdcCont,did,buffer,presamples,isUS,isMP);
72 size=process<HcalCalibDigiCollection,HcalCalibDetId>(inputs.
calibCont,did,buffer,presamples,isUS,isMP);
80 int nl1a,
int orbitn,
int bcn,
88 static const int HTRFormatVersion=5;
93 for (
int spigot=0; spigot<15; spigot++) {
94 spigots[spigot].
allocate(HTRFormatVersion);
97 int presamples=-1, samples=-1;
98 bool haveUnsuppressed=
false;
99 for (
int fiber=1; fiber<=8; fiber++)
100 for (
int fiberchan=0; fiberchan<3; fiberchan++) {
101 int linear=(fiber-1)*3+fiberchan;
103 unsigned short chanid=chanSample.
raw()&0xF800;
105 channelIsMP[linear]=
false;
111 if (!emap.
lookup(partialEid,fullEid,genId))
continue;
117 bool isUS=
false, isMP=
false;
118 int mysamples=
findSamples(genId,inputs,database,mypresamples,isUS,isMP);
119 haveUnsuppressed=haveUnsuppressed || isUS;
120 channelIsMP[linear]=isMP;
123 if (samples<0) samples=mysamples;
124 else if (samples!=mysamples) {
125 edm::LogError(
"HCAL") <<
"Mismatch of samples in a single HTR (unsupported) " << mysamples <<
" != " << samples;
129 presamples=mypresamples;
131 }
else if (mypresamples!=presamples) {
132 edm::LogError(
"HCAL") <<
"Mismatch of presamples in a single HTR (unsupported) " << mypresamples <<
" != " << presamples;
135 for (
int ii=0; ii<samples; ii++)
136 database[ii]=(database[ii]&0x7FF)|chanid;
137 preclen[linear]=(
unsigned char)(samples);
141 for (
int slb=1; slb<=6; slb++)
142 for (
int slbchan=0; slbchan<=3; slbchan++) {
143 int linear=(slb-1)*4+slbchan;
145 unsigned short chanid=idCvt.
raw()&0xF800;
152 if (!emap.
lookup(partialEid,fullEid,tid)) {
162 for (
unsigned char q=0;
q<triglen[linear];
q++)
163 trigbase[
q]=(trigbase[
q]&0x7FF)|chanid;
168 spigots[spigot].
pack(&(preclen[0]),&(precdata[0]),
169 &(triglen[0]),&(trigdata[0]),
171 static const int pipeline=0x22;
172 static const int firmwareRev=0;
174 submodule|=(exampleEId.
htrSlot()&0x1F)<<1;
184 if (haveUnsuppressed) {
192 for (
int spigot=0; spigot<15; spigot++) {
193 theSize+=spigots[spigot].
getRawLength()*
sizeof(
unsigned short);
196 theSize+=(8-(theSize%8))%8;
205 for (
int spigot=0; spigot<15; spigot++) {
206 if (spigots[spigot].getRawLength()>0)
void pack(int fedid, int dccnumber, int nl1a, int orbitn, int bcn, const Collections &inputs, const HcalElectronicsMap &emap, FEDRawData &output)
uint16_t raw() const
get the raw word
void packUnsuppressed(const bool *mp)
pack trailer with Mark and Pass bits
int htrSlot() const
get the htr slot
std::vector< T >::const_iterator const_iterator
const HcalCalibDigiCollection * calibCont
static const int CHANNELS_PER_SPIGOT
static const int MAXIMUM_SAMPLES_PER_CHANNEL
static void set(unsigned char *trailer, int evt_lgth, int crc, int evt_stat, int tts, bool T=false)
Set all fields in the trailer.
size_t size() const
Lenght of the data buffer in bytes.
int readoutVMECrateId() const
get the readout VME crate number
void allocate(int version_to_create=0)
static unsigned char processTrig(const HcalTrigPrimDigiCollection *pt, const HcalTrigTowerDetId &tid, unsigned short *buffer)
int htrTopBottom() const
get the htr top/bottom (1=top/0=bottom)
void resize(size_t newsize)
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
const int getRawLength() const
Get the length of the raw data.
uint16_t raw() const
get the raw word
const HcalTrigPrimDigiCollection * tpCont
const ZDCDigiCollection * zdcCont
const HBHEDigiCollection * hbhe
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const_iterator end() const
static const int SubdetectorId
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.
bool null() const
is this a null id ?
iterator find(key_type k)
const HODigiCollection * hoCont
void packHeaderTrailer(int L1Anumber, int bcn, int submodule, int orbitn, int pipeline, int ndd, int nps, int firmwareRev=0)
pack header and trailer (call after pack)
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
int findSamples(const DetId &did, const Collections &inputs, unsigned short *buffer, int &presamples, bool &zsUS, bool &zsMP)
const HFDigiCollection * hfCont
HcalGenericSubdetector genericSubdet() const
Detector det() const
get the detector field from this detid
Readout chain identification for Hcal [31:26] Unused (so far) [25] Trigger-chain id flag [24:20] Read...
tuple size
Write out results.
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id