12 namespace HcalUnpacker_impl {
13 template <
class DigiClass>
16 digi.setPresamples(presamples);
17 digi.setReadoutIds(eid);
19 int fiber=startPoint->
fiber();
33 while (qie_work!=limit && qie_work->
fiberAndChan()==myFiberChan) {
34 if (ncurr>=startSample && ncurr<=endSample) {
35 digi.setSample(ntaken,*qie_work);
46 template <
class DigiClass>
47 const unsigned short*
unpack_compact(
const unsigned short* startPoint,
const unsigned short*
limit, DigiClass& digi,
51 digi.setPresamples(presamples);
52 digi.setReadoutIds(eid);
53 int flavor, error_flags, capid0, channelid;
56 bool isCapRotating=!(error_flags&0x1);
57 bool fiberErr=(error_flags&0x2);
58 bool dataValid=!(error_flags&0x2);
59 int fiberchan=channelid&0x3;
60 int fiber=((channelid>>2)&0x7)+1;
72 const unsigned short* qie_work=startPoint;
76 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
77 int capidn1=(isCapRotating)?((capid0+ncurr+1)%4):(capid0);
79 HcalQIESample s0((*qie_work)&0x7F,capidn,fiber,fiberchan,dataValid,fiberErr);
80 HcalQIESample s1(((*qie_work)>>8)&0x7F,capidn1,fiber,fiberchan,dataValid,fiberErr);
82 if (ncurr>=startSample && ncurr<=endSample) {
83 digi.setSample(ntaken,s0);
87 if (ncurr>=startSample && ncurr<=endSample) {
88 digi.setSample(ntaken,s1);
94 }
else if (flavor==6) {
96 if (ncurr>=startSample && ncurr<=endSample) {
97 HcalQIESample sample((*qie_work)&0x7F,((*qie_work)>>8)&0x3,fiber,fiberchan,((*qie_work)>>10)&0x1,((*qie_work)>>11)&0x1);
98 digi.setSample(ntaken,sample);
103 digi.setSize(ntaken);
111 template <
class DigiClass>
115 digi.setPresamples(presamples-startSample);
116 digi.setReadoutIds(eid);
120 bool isCapRotating=!(error_flags&0x1);
121 bool fiberErr=(error_flags&0x2);
122 bool dataValid=!(error_flags&0x2);
129 int ncurr=0,ntaken=0;
130 for (++i; i!=iend && !i.
isHeader(); ++
i) {
131 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
135 if (ncurr>=startSample && ncurr<=endSample) {
136 digi.setSample(ntaken,
s);
141 digi.setSize(ntaken);
147 return (s.
raw()&0x200)!=0;
171 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Empty/invalid data, size = " << raw.
size();
180 else unpackUTCA(raw,emap,colls,report,silent);
183 static int slb(uint16_t theSample) {
return ((theSample>>13)&0x7); }
184 static int slbChan(uint16_t theSample) {
return (theSample>>11)&0x3; }
185 static int slbAndChan(uint16_t theSample) {
return (theSample>>11)&0x1F; }
202 const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
213 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data (data beyond payload size) observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
221 edm::LogWarning(
"Invalid Data") <<
"CRC Error on HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
234 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid uHTR data (data beyond payload size) observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
242 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
261 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
266 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Histogram data passed to non-histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
275 LogDebug(
"HcalTechTrigProcessor") <<
"Skipping data on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId() <<
" which is from the TechTrigProcessor (use separate unpacker!)";
288 htr.
dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
291 int htr_slot=(smid>>1)&0x1F;
292 int htr_cr=(smid>>6)&0x1F;
298 int currFiberChan=0x3F;
310 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
311 if (tp_work->
raw()==0xFFFF)
continue;
313 if (sector>2)
continue;
315 for (
int ibit=0; ibit<8; ibit++) {
317 if (!unrolled[linear].checked) {
319 int fiber=(linear/3)+1;
323 eid.
setHTR(htr_cr,htr_slot,htr_tb);
336 if (unrolled[linear].valid) {
338 if (tp_work->
raw()&(1<<ibit)) unrolled[
linear].
setbit(unrolled[linear].samples);
343 for (
int i=0;
i<24;
i++) {
344 if (unrolled[
i].valid)
350 unrolled[
i].databits));
353 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
354 if (tp_work->
raw()==0xFFFF)
continue;
364 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
378 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
387 colls.
tpCont->back().setSample(colls.
tpCont->back().size(),*tp_work);
388 colls.
tpCont->back().setSize(colls.
tpCont->back().size()+1);
391 if (valid && tpgSOIbitInUse &&
isTPGSOI(*tp_work)) {
392 colls.
tpCont->back().setPresamples(ncurr);
411 for (qie_work=qie_begin; qie_work!=qie_end; ) {
412 if (qie_work->
raw()==0xFFFF) {
421 eid.
setHTR(htr_cr,htr_slot,htr_tb);
462 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
472 const unsigned short* ptr_header=daq_first;
473 const unsigned short* ptr_end=daq_last+1;
474 int flavor, error_flags, capid0, channelid;
476 while (ptr_header!=ptr_end) {
477 if (*ptr_header==0xFFFF) {
488 int fiberchan=channelid&0x3;
489 int fiber=((channelid>>2)&0x7)+1;
493 eid.
setHTR(htr_cr,htr_slot,htr_tb);
534 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
553 int namc=amc13->
NAMC();
554 for (
int iamc=0; iamc<namc; iamc++) {
560 edm::LogWarning(
"Invalid Data") <<
"Missing data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
566 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
573 edm::LogWarning(
"Invalid Data") <<
"Unpacker cannot handle segmented data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
580 int crate=amc13->
AMCId(iamc)&0xFF;
582 int nps=(amc13->
AMCId(iamc)>>12)&0xF;
593 if (i.flavor() == 2) {
594 int ifiber=((i.channelid()>>2)&0x1F);
595 int ichan=(i.channelid()&0x3);
600 const uint16_t* head_pos = i.raw();
602 for (++i; i != iend && !i.isHeader(); ++
i) {
607 if (colls.
qie10 == 0) {
612 edm::LogError(
"Invalid Data") <<
"Collection has " << colls.
qie10->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
619 else if (i.flavor()==0x5) {
620 int ifiber=((i.channelid()>>2)&0x1F);
621 int ichan=(i.channelid()&0x3);
654 i!=iend && !i.isHeader();
663 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
667 i!=iend && !i.isHeader();
670 }
else if (i.flavor()==0x4) {
671 int ilink=((i.channelid()>>4)&0xF);
672 int itower=(i.channelid()&0xF);
679 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
683 for (++i; i!=iend && !i.isHeader(); ++
i);
686 for (++i; i!=iend && !i.isHeader(); ++
i);
692 for (++i; i!=iend && !i.isHeader(); ++
i) {
693 colls.
tpCont->back().setSample(j,i.value());
694 if (i.soi()) colls.
tpCont->back().setPresamples(j);
697 colls.
tpCont->back().setSize(j);
702 i!=iend && !i.isHeader();
735 if (retval || !htr.
check()) {
736 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
740 edm::LogWarning(
"Invalid Data") <<
"Non-histogram data passed to histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
746 int htr_slot=(smid>>1)&0x1F;
747 int htr_cr=(smid>>6)&0x1F;
753 for (
int nf=0; nf<2; nf++) {
754 if (f[nf]<0 || (nf==1 && f[0]==f[1]))
continue;
755 for (fc=0; fc<=2; fc++) {
757 eid.
setHTR(htr_cr,htr_slot,htr_tb);
762 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" << eid;
771 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...
static int slbAndChan(uint16_t theSample)
void unpackUTCA(const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
std::vector< HcalTTPDigi > * ttp
std::vector< HFDataFrame > * hfCont
int fiberAndChan() const
get the id channel
int fiberChan() const
get the fiber channel number
void addDataFrame(DetId detid, const uint16_t *data)
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 getFormatVersion() const
Get the version number of this event.
size_t size() const
Lenght of the data buffer in bytes.
void countSpigotFormatError()
HcalDataFrameContainer< QIE10DataFrame > QIE10DigiCollection
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 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
void unpackVME(const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
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
static int slb(uint16_t theSample)
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.
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.
QIE10DigiCollection * qie10
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.
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)
static int slbChan(uint16_t theSample)