10 namespace HcalUnpacker_impl {
11 template <
class DigiClass>
14 digi.setPresamples(presamples);
15 digi.setReadoutIds(eid);
17 int fiber=startPoint->
fiber();
31 while (qie_work!=limit && qie_work->
fiberAndChan()==myFiberChan) {
32 if (ncurr>=startSample && ncurr<=endSample) {
33 digi.setSample(ntaken,*qie_work);
44 template <
class DigiClass>
45 const unsigned short*
unpack_compact(
const unsigned short* startPoint,
const unsigned short*
limit, DigiClass& digi,
49 digi.setPresamples(presamples);
50 digi.setReadoutIds(eid);
51 int flavor, error_flags, capid0, channelid;
54 bool isCapRotating=!(error_flags&0x1);
55 bool fiberErr=(error_flags&0x2);
56 bool dataValid=!(error_flags&0x2);
57 int fiberchan=channelid&0x3;
58 int fiber=((channelid>>2)&0x7)+1;
70 const unsigned short* qie_work=startPoint;
74 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
75 int capidn1=(isCapRotating)?((capid0+ncurr+1)%4):(capid0);
77 HcalQIESample s0((*qie_work)&0x7F,capidn,fiber,fiberchan,dataValid,fiberErr);
78 HcalQIESample s1(((*qie_work)>>8)&0x7F,capidn1,fiber,fiberchan,dataValid,fiberErr);
80 if (ncurr>=startSample && ncurr<=endSample) {
81 digi.setSample(ntaken,s0);
85 if (ncurr>=startSample && ncurr<=endSample) {
86 digi.setSample(ntaken,s1);
92 }
else if (flavor==6) {
94 if (ncurr>=startSample && ncurr<=endSample) {
95 HcalQIESample sample((*qie_work)&0x7F,((*qie_work)>>8)&0x3,fiber,fiberchan,((*qie_work)>>10)&0x1,((*qie_work)>>11)&0x1);
96 digi.setSample(ntaken,sample);
101 digi.setSize(ntaken);
109 return (s.
raw()&0x200)!=0;
133 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Empty/invalid DCC data, size = " << raw.
size();
148 const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
159 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data (data beyond payload size) observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
167 edm::LogWarning(
"Invalid Data") <<
"CRC Error on HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
180 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid uHTR data (data beyond payload size) observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
188 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
207 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
212 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Histogram data passed to non-histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
221 LogDebug(
"HcalTechTrigProcessor") <<
"Skipping data on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId() <<
" which is from the TechTrigProcessor (use separate unpacker!)";
234 htr.
dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
237 int htr_slot=(smid>>1)&0x1F;
238 int htr_cr=(smid>>6)&0x1F;
244 int currFiberChan=0x3F;
256 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
257 if (tp_work->
raw()==0xFFFF)
continue;
259 if (sector>2)
continue;
261 for (
int ibit=0; ibit<8; ibit++) {
262 int linear=sector*8+ibit;
263 if (!unrolled[linear].checked) {
265 int fiber=(linear/3)+1;
269 eid.
setHTR(htr_cr,htr_slot,htr_tb);
274 unrolled[linear].
valid=
true;
282 if (unrolled[linear].valid) {
284 if (tp_work->
raw()&(1<<ibit)) unrolled[linear].
setbit(unrolled[linear].samples);
289 for (
int i=0;
i<24;
i++) {
290 if (unrolled[
i].valid)
296 unrolled[
i].databits));
299 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
300 if (tp_work->
raw()==0xFFFF)
continue;
310 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
324 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
333 colls.
tpCont->back().setSample(colls.
tpCont->back().size(),*tp_work);
334 colls.
tpCont->back().setSize(colls.
tpCont->back().size()+1);
337 if (valid && tpgSOIbitInUse &&
isTPGSOI(*tp_work)) {
338 colls.
tpCont->back().setPresamples(ncurr);
357 for (qie_work=qie_begin; qie_work!=qie_end; ) {
358 if (qie_work->
raw()==0xFFFF) {
367 eid.
setHTR(htr_cr,htr_slot,htr_tb);
408 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
418 const unsigned short* ptr_header=daq_first;
419 const unsigned short* ptr_end=daq_last+1;
420 int flavor, error_flags, capid0, channelid;
422 while (ptr_header!=ptr_end) {
423 if (*ptr_header==0xFFFF) {
434 int fiberchan=channelid&0x3;
435 int fiber=((channelid>>2)&0x7)+1;
439 eid.
setHTR(htr_cr,htr_slot,htr_tb);
480 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
542 if (retval || !htr.
check()) {
543 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
547 edm::LogWarning(
"Invalid Data") <<
"Non-histogram data passed to histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
553 int htr_slot=(smid>>1)&0x1F;
554 int htr_cr=(smid>>6)&0x1F;
560 for (
int nf=0; nf<2; nf++) {
561 if (f[nf]<0 || (nf==1 && f[0]==f[1]))
continue;
562 for (fc=0; fc<=2; fc++) {
564 eid.
setHTR(htr_cr,htr_slot,htr_tb);
569 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" << eid;
578 for (
int capid=0; capid<4; capid++)
std::set< HcalElectronicsId > unknownIds_
int sourceIdOffset_
number to subtract from the source id to get the dcc id
int endSample_
last sample from fed raw data to copy (if present)
int startSample_
first sample from fed raw data to copy
void countUnmappedTPDigi()
uint16_t raw() const
get the raw word
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
std::vector< HcalTTPDigi > * ttp
std::vector< HFDataFrame > * hfCont
int fiberAndChan() const
get the id channel
int fiberChan() const
get the fiber channel number
static bool isTPGSOI(const HcalTriggerPrimitiveSample &s)
const unsigned short * unpack_compact(const unsigned short *startPoint, const unsigned short *limit, DigiClass &digi, int presamples, const HcalElectronicsId &eid, int startSample, int endSample, int expectedTime, const HcalHTRData &hhd)
std::vector< HBHEDataFrame > * hbheCont
std::vector< HOTriggerPrimitiveDigi > * tphoCont
bool wasMarkAndPassZS(int fiber, int fiberchan) const
Was this channel passed as part of Mark&Pass ZS?
unsigned int getFibOrbMsgBCN(int fiber) const
Get the BCN of the Fiber Orbit Messages.
static bool unpack_per_channel_header(unsigned short, int &flav, int &error_flags, int &capid0, int &channelid)
Unpack a per-channel header word (compact format)
void getHistogramFibers(int &a, int &b) const
Get the fiber numbers for the data present in this event (only in histogram mode!) ...
int slbChan() const
get the slb channel number
int getFormatVersion() const
Get the version number of this event.
size_t size() const
Lenght of the data buffer in bytes.
void countSpigotFormatError()
bool isUnsuppressed() const
Is this event an unsuppresed event?
bool isOverflowWarning() const
bool unpackHistogram(int fiber, int fiberchan, int capid, unsigned short *histogram) const
Unpack special histogramming mode data.
static bool is_channel_header(unsigned short value)
check top bit to see if this is a compact format channel header word
int slbAndChan() const
get the id channel
int expectedOrbitMessageTime_
Expected orbit bunch time (needed to evaluate time differences)
bool isEmptyEvent() const
int ieta() const
get the cell ieta
uint16_t raw() const
get the raw word
std::vector< HcalTriggerPrimitiveDigi > * tpCont
int fiber() const
get the fiber number
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::set< HcalElectronicsId > unknownIdsTrig_
Recorded to limit number of times a log message is generated.
int iphi() const
get the cell iphi
void setHTR(int crate, int slot, int tb)
void unpack(const FEDRawData &raw, const HcalElectronicsMap &emap, std::vector< HcalHistogramDigi > &histoDigis)
static const int SubdetectorId
std::vector< HcalCalibDataFrame > * calibCont
HcalOtherSubdetector subdet() const
get the category
void dataPointers(const unsigned short **daq_first, const unsigned short **daq_last, const unsigned short **tp_first, const unsigned short **tp_last) const
Obtain the starting and ending pointers for external unpacking of the data.
bool unpack(const HcalHTRData &data, HcalTTPDigi &digi)
bool null() const
is this a null id ?
std::vector< HODataFrame > * hoCont
int getNPS() const
Get the number of presamples in daq data.
static const HcalTrigTowerDetId Undefined
static const int FORMAT_VERSION_COMPACT_DATA
int getFirmwareFlavor() const
Get the HTR firmware flavor.
int slb() const
get the slb site number
bool wasMarkAndPassZSTP(int slb, int slbchan) const
Was this channel passed as part of Mark&Pass ZS?
uint16_t * getArray(int capid)
get the array for the specified capid
uint32_t zsBunchMask() const
ZS Bunch Mask (if available)
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
std::vector< ZDCDataFrame > * zdcCont
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
unsigned int getSubmodule() const
Get the HTR submodule number.
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...
void countEmptyEventSpigot()
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
const HcalQIESample * unpack(const HcalQIESample *startPoint, const HcalQIESample *limit, DigiClass &digi, int presamples, const HcalElectronicsId &eid, int startSample, int endSample, int expectedTime, const HcalHTRData &hhd)