15 namespace HcalUnpacker_impl {
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();
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; }
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!)";
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) {
345 if (tp_work->
raw()&(1<<ibit)) unrolled[
linear].
setbit(unrolled[linear].samples);
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;
371 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
385 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
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);
418 for (qie_work=qie_begin; qie_work!=qie_end; ) {
419 if (qie_work->
raw()==0xFFFF) {
428 eid.
setHTR(htr_cr,htr_slot,htr_tb);
469 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
479 const unsigned short* ptr_header=daq_first;
480 const unsigned short* ptr_end=daq_last+1;
481 int flavor, error_flags, capid0, channelid;
483 while (ptr_header!=ptr_end) {
484 if (*ptr_header==0xFFFF) {
495 int fiberchan=channelid&0x3;
496 int fiber=((channelid>>2)&0x7)+1;
500 eid.
setHTR(htr_cr,htr_slot,htr_tb);
541 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
560 int namc=amc13->
NAMC();
561 for (
int iamc=0; iamc<namc; iamc++) {
567 edm::LogWarning(
"Invalid Data") <<
"Missing data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
573 edm::LogWarning(
"Invalid Data") <<
"CRC Error on uHTR data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
580 edm::LogWarning(
"Invalid Data") <<
"Unpacker cannot handle segmented data observed on iamc " << iamc <<
" of AMC13 with source id " << amc13->
sourceId();
587 int crate=amc13->
AMCId(iamc)&0xFF;
589 int nps=(amc13->
AMCId(iamc)>>12)&0xF;
593 if(uhtr.getFormatVersion() != 1) {
598 int nwords=uhtr.getRawLengthBytes()/2;
599 for (
int iw=0; iw<nwords; iw++)
600 printf(
"%04d %04x\n",iw,uhtr.getRawData16()[iw]);
612 std::cout <<
"its not a header" << std::endl;
623 const uint16_t* head_pos = i.
raw();
625 for (++i; i != iend && !i.
isHeader(); ++
i) {
629 if (colls.
qie11 == 0) {
634 edm::LogError(
"Invalid Data") <<
"Collection has " << colls.
qie11->
samples() <<
" samples per digi, raw data has " << ns <<
"!";
645 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << 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()) {
699 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << 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) {
754 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
761 }
else if (i.
flavor()==0x4) {
772 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << 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);
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);
860 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" << 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) );
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
QIE10DigiCollection * qie10ZDC
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.
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)