16 template <
class DigiClass>
19 digi.setPresamples(presamples);
20 digi.setReadoutIds(eid);
22 int fiber=startPoint->
fiber();
38 while (qie_work!=limit && qie_work->
fiberAndChan()==myFiberChan) {
39 if (ncurr>=startSample && ncurr<=endSample) {
40 digi.setSample(ntaken,*qie_work);
51 template <
class DigiClass>
52 const unsigned short*
unpack_compact(
const unsigned short* startPoint,
const unsigned short*
limit, DigiClass& digi,
56 digi.setPresamples(presamples);
57 digi.setReadoutIds(eid);
58 int flavor, error_flags, capid0, channelid;
61 bool isCapRotating=!(error_flags&0x1);
62 bool fiberErr=(error_flags&0x2);
63 bool dataValid=!(error_flags&0x2);
64 int fiberchan=channelid&0x3;
65 int fiber=((channelid>>2)&0x7)+1;
79 const unsigned short* qie_work=startPoint;
83 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
84 int capidn1=(isCapRotating)?((capid0+ncurr+1)%4):(capid0);
86 HcalQIESample s0((*qie_work)&0x7F,capidn,fiber,fiberchan,dataValid,fiberErr);
87 HcalQIESample s1(((*qie_work)>>8)&0x7F,capidn1,fiber,fiberchan,dataValid,fiberErr);
89 if (ncurr>=startSample && ncurr<=endSample) {
90 digi.setSample(ntaken,s0);
94 if (ncurr>=startSample && ncurr<=endSample) {
95 digi.setSample(ntaken,s1);
100 digi.setSize(ntaken);
101 }
else if (flavor==6) {
103 if (ncurr>=startSample && ncurr<=endSample) {
104 HcalQIESample sample((*qie_work)&0x7F,((*qie_work)>>8)&0x3,fiber,fiberchan,((*qie_work)>>10)&0
x1,((*qie_work)>>11)&0
x1);
105 digi.setSample(ntaken,sample);
110 digi.setSize(ntaken);
118 template <
class DigiClass>
122 digi.setPresamples(presamples-startSample);
123 digi.setReadoutIds(eid);
128 bool isCapRotating=!(error_flags&0x1);
129 bool fiberErr=(error_flags&0x2);
130 bool dataValid=!(error_flags&0x2);
137 int ncurr=0,ntaken=0;
139 for (++i; i!=iend && !i.
isHeader(); ++
i) {
140 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
144 if (ncurr>=startSample && ncurr<=endSample) {
145 digi.setSample(ntaken,
s);
150 digi.setSize(ntaken);
153 for (++i; i!=iend && !i.
isHeader(); ++
i) {
154 if (ncurr>=startSample && ncurr<=endSample) {
156 digi.setSample(ntaken,
sample);
161 digi.setSize(ntaken);
169 return (s.
raw()&0x200)!=0;
193 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Empty/invalid data, size = " << raw.
size();
201 unpackVME(raw,emap,colls,report,silent);
202 else unpackUTCA(raw,emap,colls,report,silent);
205 static int slb(uint16_t theSample) {
return ((theSample>>13)&0x7); }
206 static int slbChan(uint16_t theSample) {
return (theSample>>11)&0x3; }
207 static int slbAndChan(uint16_t theSample) {
return (theSample>>11)&0x1F; }
218 int dccid=(is_VME_DCC)?(dccHeader->
getSourceId()-sourceIdOffset_):(dtcHeader->
getSourceId()-sourceIdOffset_);
224 const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
235 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data (data beyond payload size) observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
243 edm::LogWarning(
"Invalid Data") <<
"CRC Error on HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
256 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid uHTR data (data beyond payload size) observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
264 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
283 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
288 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Histogram data passed to non-histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
292 if (colls.
ttp!=
nullptr) {
297 LogDebug(
"HcalTechTrigProcessor") <<
"Skipping data on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId() <<
" which is from the TechTrigProcessor (use separate unpacker!)";
307 int nps=htr.
getNPS()-startSample_;
310 htr.
dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
313 int htr_slot=(smid>>1)&0x1F;
314 int htr_cr=(smid>>6)&0x1F;
320 int currFiberChan=0x3F;
332 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
333 if (tp_work->
raw()==0xFFFF)
continue;
335 if (sector>2)
continue;
337 for (
int ibit=0; ibit<8; ibit++) {
339 if (!unrolled[linear].checked) {
341 int fiber=(linear/3)+1;
345 eid.
setHTR(htr_cr,htr_slot,htr_tb);
358 if (unrolled[linear].valid) {
365 for (
int i=0;
i<24;
i++) {
366 if (unrolled[
i].valid)
372 unrolled[
i].databits));
375 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
376 if (tp_work->
raw()==0xFFFF)
continue;
385 if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) {
386 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" <<
eid;
387 unknownIdsTrig_.insert(eid);
400 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
408 if (valid && ((tpgSOIbitInUse && ncurr<10) || (ncurr>=startSample_ && ncurr<=endSample_))) {
409 colls.
tpCont->back().setSample(colls.
tpCont->back().size(),*tp_work);
410 colls.
tpCont->back().setSize(colls.
tpCont->back().size()+1);
413 if (valid && tpgSOIbitInUse &&
isTPGSOI(*tp_work)) {
414 colls.
tpCont->back().setPresamples(ncurr);
430 for (qie_work=qie_begin; qie_work!=qie_end; ) {
431 if (qie_work->
raw()==0xFFFF) {
439 eid.setHTR(htr_cr,htr_slot,htr_tb);
445 qie_work=HcalUnpacker_impl::unpack<ZDCDataFrame>(qie_work, qie_end, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
451 qie_work=HcalUnpacker_impl::unpack<HBHEDataFrame>(qie_work, qie_end, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
455 qie_work=HcalUnpacker_impl::unpack<HODataFrame>(qie_work, qie_end, colls.
hoCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
459 qie_work=HcalUnpacker_impl::unpack<HFDataFrame>(qie_work, qie_end, colls.
hfCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
465 qie_work=HcalUnpacker_impl::unpack<HcalCalibDataFrame>(qie_work, qie_end, colls.
calibCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
479 if (unknownIds_.find(
eid)==unknownIds_.end()) {
480 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
481 unknownIds_.insert(
eid);
490 const unsigned short* ptr_header=daq_first;
491 const unsigned short* ptr_end=daq_last+1;
492 int flavor, error_flags, capid0, channelid;
494 while (ptr_header!=ptr_end) {
495 if (*ptr_header==0xFFFF) {
506 int fiberchan=channelid&0x3;
507 int fiber=((channelid>>2)&0x7)+1;
511 eid.
setHTR(htr_cr,htr_slot,htr_tb);
517 ptr_header=HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(ptr_header, ptr_end, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
523 ptr_header=HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(ptr_header, ptr_end, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
527 ptr_header=HcalUnpacker_impl::unpack_compact<HODataFrame>(ptr_header, ptr_end, colls.
hoCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
531 ptr_header=HcalUnpacker_impl::unpack_compact<HFDataFrame>(ptr_header, ptr_end, colls.
hfCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
537 ptr_header=HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(ptr_header, ptr_end, colls.
calibCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
551 if (unknownIds_.find(eid)==unknownIds_.end()) {
552 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
553 unknownIds_.insert(eid);
571 int namc=amc13->
NAMC();
572 for (
int iamc=0; iamc<namc; iamc++) {
578 edm::LogWarning(
"Invalid Data") <<
"Missing data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
584 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
591 edm::LogWarning(
"Invalid Data") <<
"Unpacker cannot handle segmented data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
598 int crate=amc13->
AMCId(iamc)&0xFF;
600 int nps=(amc13->
AMCId(iamc)>>12)&0xF;
604 if(uhtr.getFormatVersion() != 1) {
605 unpackUMNio(raw, slot, colls);
610 int nwords=uhtr.getRawLengthBytes()/2;
611 for (
int iw=0; iw<nwords; iw++)
612 printf(
"%04d %04x\n",iw,uhtr.getRawData16()[iw]);
616 nps = uhtr.presamples();
626 std::cout <<
"its not a header" << std::endl;
637 const uint16_t* head_pos = i.
raw();
639 for (++i; i != iend && !i.
isHeader(); ++
i) {
643 if (colls.
qie11 ==
nullptr) {
648 edm::LogError(
"Invalid Data") <<
"QIE11 Collection has " << colls.
qie11->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
658 if (unknownIds_.find(eid)==unknownIds_.end()) {
659 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
660 unknownIds_.insert(eid);
662 std::cout <<
"HcalUnpacker: No match found for electronics id :" << eid << std::endl;
666 std::cout <<
"OH NO! detector id is null!" << std::endl;
669 }
else if (i.
flavor() == 2){
678 const uint16_t* head_pos = i.
raw();
680 for (++i; i != iend && !i.
isHeader(); ++
i) {
690 edm::LogError(
"Invalid Data") <<
"QIE10ZDC Collection has " << colls.
qie10ZDC->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
694 if (colls.
qie10 ==
nullptr) {
699 edm::LogError(
"Invalid Data") <<
"QIE10 Collection has " << colls.
qie10->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
708 else if (!did.
null()) {
712 if (unknownIds_.find(eid)==unknownIds_.end()) {
713 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
714 unknownIds_.insert(eid);
716 std::cout <<
"HcalUnpacker: No match found for electronics id :" << eid << std::endl;
720 std::cout <<
"OH NO! HcalUnpacker: No match found for electronics id :" << eid << std::endl;
733 HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(
i,iend, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_);
739 HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(
i, iend, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_);
743 HcalUnpacker_impl::unpack_compact<HODataFrame>(
i, iend, colls.
hoCont->back(), nps,
eid, startSample_, endSample_);
747 HcalUnpacker_impl::unpack_compact<HFDataFrame>(
i, iend, colls.
hfCont->back(), nps,
eid, startSample_, endSample_);
753 HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(
i, iend, colls.
calibCont->back(), nps,
eid, startSample_, endSample_);
767 if (unknownIds_.find(eid)==unknownIds_.end()) {
768 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
769 unknownIds_.insert(eid);
775 }
else if (i.
flavor()==0x4) {
785 if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) {
786 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" <<
eid;
787 unknownIdsTrig_.insert(eid);
790 for (++i; i!=iend && !i.
isHeader(); ++
i);
793 for (++i; i!=iend && !i.
isHeader(); ++
i);
797 std::cout <<
"Unpacking " <<
id << std::endl;
801 for (++i; i!=iend && !i.
isHeader(); ++
i) {
803 if (i.
soi()) colls.
tpCont->back().setPresamples(j);
806 colls.
tpCont->back().setSize(j);
836 int dccid=dccHeader->
getSourceId()-sourceIdOffset_;
847 if (retval || !htr.
check()) {
848 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
852 edm::LogWarning(
"Invalid Data") <<
"Non-histogram data passed to histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
858 int htr_slot=(smid>>1)&0x1F;
859 int htr_cr=(smid>>6)&0x1F;
865 for (
int nf=0; nf<2; nf++) {
866 if (f[nf]<0 || (nf==1 && f[0]==f[1]))
continue;
867 for (fc=0; fc<=2; fc++) {
869 eid.
setHTR(htr_cr,htr_slot,htr_tb);
873 if (unknownIds_.find(eid)==unknownIds_.end()) {
874 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" <<
eid;
875 unknownIds_.insert(eid);
883 for (
int capid=0; capid<4; capid++)
893 int namc=amc13->
NAMC();
895 for (
int iamc=0; iamc<namc; iamc++) {
896 if (amc13->
AMCSlot(iamc) == slot) namc = iamc;
898 if (namc==amc13->
NAMC()) {
901 const uint16_t*
data = (
const uint16_t*)(amc13->
AMCPayload(namc));
902 size_t nwords = amc13->
AMCSize(namc) * (
sizeof(
uint64_t) /
sizeof(uint16_t) );
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
QIE10DigiCollection * qie10ZDC
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 technicalDataType() const
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
HcalDataFrameContainer< QIE11DataFrame > QIE11DigiCollection
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)
unsigned long long uint64_t
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
QIE11DigiCollection * qie11
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.
char data[epos_bytes_allocation]
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.
void unpackUMNio(const FEDRawData &raw, int slot, Collections &colls)
Detector det() const
get the detector field from this detid
const uint16_t * raw() const
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)