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);
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
static int slb(const HcalTriggerPrimitiveSample &theSample)
void packUnsuppressed(const bool *mp)
pack trailer with Mark and Pass bits
int htrSlot() const
get the htr slot
std::vector< HcalTriggerPrimitiveDigi >::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), valid for VME
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.
tuple size
Write out results.
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id