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)&0x1,((*qie_work)>>11)&0x1);
105 digi.setSample(ntaken,sample);
110 digi.setSize(ntaken);
118 template <
class DigiClass>
122 digi.setPresamples(presamples-startSample);
123 digi.setReadoutIds(eid);
127 bool isCapRotating=!(error_flags&0x1);
128 bool fiberErr=(error_flags&0x2);
129 bool dataValid=!(error_flags&0x2);
136 int ncurr=0,ntaken=0;
137 for (++i; i!=iend && !i.
isHeader(); ++
i) {
138 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
142 if (ncurr>=startSample && ncurr<=endSample) {
143 digi.setSample(ntaken,
s);
148 digi.setSize(ntaken);
154 return (s.
raw()&0x200)!=0;
178 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Empty/invalid data, size = " << raw.
size();
186 unpackVME(raw,emap,colls,report,silent);
187 else unpackUTCA(raw,emap,colls,report,silent);
190 static int slb(uint16_t theSample) {
return ((theSample>>13)&0x7); }
191 static int slbChan(uint16_t theSample) {
return (theSample>>11)&0x3; }
192 static int slbAndChan(uint16_t theSample) {
return (theSample>>11)&0x1F; }
203 int dccid=(is_VME_DCC)?(dccHeader->
getSourceId()-sourceIdOffset_):(dtcHeader->
getSourceId()-sourceIdOffset_);
209 const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
220 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data (data beyond payload size) observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
228 edm::LogWarning(
"Invalid Data") <<
"CRC Error on HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
241 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid uHTR data (data beyond payload size) observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
249 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on slot " << slot <<
" of DTC with source id " << dtcHeader->
getSourceId();
268 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
273 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Histogram data passed to non-histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
282 LogDebug(
"HcalTechTrigProcessor") <<
"Skipping data on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId() <<
" which is from the TechTrigProcessor (use separate unpacker!)";
292 int nps=htr.
getNPS()-startSample_;
295 htr.
dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
298 int htr_slot=(smid>>1)&0x1F;
299 int htr_cr=(smid>>6)&0x1F;
305 int currFiberChan=0x3F;
317 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
318 if (tp_work->
raw()==0xFFFF)
continue;
320 if (sector>2)
continue;
322 for (
int ibit=0; ibit<8; ibit++) {
324 if (!unrolled[linear].checked) {
326 int fiber=(linear/3)+1;
330 eid.
setHTR(htr_cr,htr_slot,htr_tb);
343 if (unrolled[linear].valid) {
350 for (
int i=0;
i<24;
i++) {
351 if (unrolled[
i].valid)
357 unrolled[
i].databits));
360 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
361 if (tp_work->
raw()==0xFFFF)
continue;
370 if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) {
371 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" <<
eid;
372 unknownIdsTrig_.insert(eid);
385 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
393 if (valid && ((tpgSOIbitInUse && ncurr<10) || (ncurr>=startSample_ && ncurr<=endSample_))) {
394 colls.
tpCont->back().setSample(colls.
tpCont->back().size(),*tp_work);
395 colls.
tpCont->back().setSize(colls.
tpCont->back().size()+1);
398 if (valid && tpgSOIbitInUse &&
isTPGSOI(*tp_work)) {
399 colls.
tpCont->back().setPresamples(ncurr);
415 for (qie_work=qie_begin; qie_work!=qie_end; ) {
416 if (qie_work->
raw()==0xFFFF) {
424 eid.setHTR(htr_cr,htr_slot,htr_tb);
430 qie_work=HcalUnpacker_impl::unpack<ZDCDataFrame>(qie_work, qie_end, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
436 qie_work=HcalUnpacker_impl::unpack<HBHEDataFrame>(qie_work, qie_end, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
440 qie_work=HcalUnpacker_impl::unpack<HODataFrame>(qie_work, qie_end, colls.
hoCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
444 qie_work=HcalUnpacker_impl::unpack<HFDataFrame>(qie_work, qie_end, colls.
hfCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
450 qie_work=HcalUnpacker_impl::unpack<HcalCalibDataFrame>(qie_work, qie_end, colls.
calibCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
464 if (unknownIds_.find(
eid)==unknownIds_.end()) {
465 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
466 unknownIds_.insert(
eid);
475 const unsigned short* ptr_header=daq_first;
476 const unsigned short* ptr_end=daq_last+1;
477 int flavor, error_flags, capid0, channelid;
479 while (ptr_header!=ptr_end) {
480 if (*ptr_header==0xFFFF) {
491 int fiberchan=channelid&0x3;
492 int fiber=((channelid>>2)&0x7)+1;
496 eid.
setHTR(htr_cr,htr_slot,htr_tb);
502 ptr_header=HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(ptr_header, ptr_end, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
508 ptr_header=HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(ptr_header, ptr_end, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
512 ptr_header=HcalUnpacker_impl::unpack_compact<HODataFrame>(ptr_header, ptr_end, colls.
hoCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
516 ptr_header=HcalUnpacker_impl::unpack_compact<HFDataFrame>(ptr_header, ptr_end, colls.
hfCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
522 ptr_header=HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(ptr_header, ptr_end, colls.
calibCont->back(), nps,
eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
536 if (unknownIds_.find(eid)==unknownIds_.end()) {
537 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
538 unknownIds_.insert(eid);
556 int namc=amc13->
NAMC();
557 for (
int iamc=0; iamc<namc; iamc++) {
563 edm::LogWarning(
"Invalid Data") <<
"Missing data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
569 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
576 edm::LogWarning(
"Invalid Data") <<
"Unpacker cannot handle segmented data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
583 int crate=amc13->
AMCId(iamc)&0xFF;
585 int nps=(amc13->
AMCId(iamc)>>12)&0xF;
589 if(uhtr.getFormatVersion() != 1) {
590 unpackUMNio(raw, slot, colls);
594 int nwords=uhtr.getRawLengthBytes()/2;
595 for (
int iw=0; iw<nwords; iw++)
596 printf(
"%04d %04x\n",iw,uhtr.getRawData16()[iw]);
600 nps = uhtr.presamples();
610 std::cout <<
"its not a header" << std::endl;
621 const uint16_t* head_pos = i.
raw();
623 for (++i; i != iend && !i.
isHeader(); ++
i) {
627 if(uhtr.wasSimulatedHTR()) ns--;
629 if (colls.
qie11 == 0) {
634 edm::LogError(
"Invalid Data") <<
"Collection has " << colls.
qie11->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
644 if (unknownIds_.find(eid)==unknownIds_.end()) {
645 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
646 unknownIds_.insert(eid);
648 std::cout <<
"HcalUnpacker: No match found for electronics id :" << eid << std::endl;
652 std::cout <<
"OH NO! detector id is null!" << std::endl;
655 }
else if (i.
flavor() == 2){
664 const uint16_t* head_pos = i.
raw();
666 for (++i; i != iend && !i.
isHeader(); ++
i) {
680 if (colls.
qie10 == 0) {
685 edm::LogError(
"Invalid Data") <<
"Collection has " << colls.
qie10->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
694 else if (!did.
null()) {
698 if (unknownIds_.find(eid)==unknownIds_.end()) {
699 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
700 unknownIds_.insert(eid);
702 std::cout <<
"HcalUnpacker: No match found for electronics id :" << eid << std::endl;
706 std::cout <<
"OH NO! HcalUnpacker: No match found for electronics id :" << eid << std::endl;
710 else if (i.
flavor()==0x5) {
719 HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(
i,iend, colls.
zdcCont->back(), nps,
eid, startSample_, endSample_);
725 HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(
i, iend, colls.
hbheCont->back(), nps,
eid, startSample_, endSample_);
729 HcalUnpacker_impl::unpack_compact<HODataFrame>(
i, iend, colls.
hoCont->back(), nps,
eid, startSample_, endSample_);
733 HcalUnpacker_impl::unpack_compact<HFDataFrame>(
i, iend, colls.
hfCont->back(), nps,
eid, startSample_, endSample_);
739 HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(
i, iend, colls.
calibCont->back(), nps,
eid, startSample_, endSample_);
753 if (unknownIds_.find(eid)==unknownIds_.end()) {
754 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" <<
eid;
755 unknownIds_.insert(eid);
761 }
else if (i.
flavor()==0x4) {
771 if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) {
772 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" <<
eid;
773 unknownIdsTrig_.insert(eid);
776 for (++i; i!=iend && !i.
isHeader(); ++
i);
779 for (++i; i!=iend && !i.
isHeader(); ++
i);
783 std::cout <<
"Unpacking " <<
id << std::endl;
787 for (++i; i!=iend && !i.
isHeader(); ++
i) {
789 if (i.
soi()) colls.
tpCont->back().setPresamples(j);
792 colls.
tpCont->back().setSize(j);
822 int dccid=dccHeader->
getSourceId()-sourceIdOffset_;
833 if (retval || !htr.
check()) {
834 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
838 edm::LogWarning(
"Invalid Data") <<
"Non-histogram data passed to histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
844 int htr_slot=(smid>>1)&0x1F;
845 int htr_cr=(smid>>6)&0x1F;
851 for (
int nf=0; nf<2; nf++) {
852 if (f[nf]<0 || (nf==1 && f[0]==f[1]))
continue;
853 for (fc=0; fc<=2; fc++) {
855 eid.
setHTR(htr_cr,htr_slot,htr_tb);
859 if (unknownIds_.find(eid)==unknownIds_.end()) {
860 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" <<
eid;
861 unknownIds_.insert(eid);
869 for (
int capid=0; capid<4; capid++)
879 int namc=amc13->
NAMC();
881 for (
int iamc=0; iamc<namc; iamc++) {
882 if (amc13->
AMCSlot(iamc) == slot) namc = iamc;
884 if (namc==amc13->
NAMC()) {
887 const uint16_t*
data = (
const uint16_t*)(amc13->
AMCPayload(namc));
888 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 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)