9 namespace HcalUnpacker_impl {
10 template <
class DigiClass>
13 digi.setPresamples(presamples);
14 digi.setReadoutIds(eid);
16 int fiber=startPoint->
fiber();
30 while (qie_work!=limit && qie_work->
fiberAndChan()==myFiberChan) {
31 if (ncurr>=startSample && ncurr<=endSample) {
32 digi.setSample(ntaken,*qie_work);
43 template <
class DigiClass>
44 const unsigned short*
unpack_compact(
const unsigned short* startPoint,
const unsigned short*
limit, DigiClass& digi,
47 digi.setPresamples(presamples);
48 digi.setReadoutIds(eid);
49 int flavor, error_flags, capid0, channelid;
52 bool isCapRotating=!(error_flags&0x1);
53 bool fiberErr=(error_flags&0x2);
54 bool dataValid=!(error_flags&0x2);
55 int fiberchan=channelid&0x3;
56 int fiber=((channelid>>2)&0x7)+1;
68 const unsigned short* qie_work=startPoint;
70 int capidn=(isCapRotating)?((capid0+ncurr)%4):(capid0);
71 int capidn1=(isCapRotating)?((capid0+ncurr+1)%4):(capid0);
73 HcalQIESample s0((*qie_work)&0x7F,capidn,fiber,fiberchan,dataValid,fiberErr);
74 HcalQIESample s1(((*qie_work)>>8)&0x7F,capidn1,fiber,fiberchan,dataValid,fiberErr);
76 if (ncurr>=startSample && ncurr<=endSample) {
77 digi.setSample(ntaken,s0);
81 if (ncurr>=startSample && ncurr<=endSample) {
82 digi.setSample(ntaken,s1);
94 return (s.
raw()&0x200)!=0;
118 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Empty/invalid DCC data, size = " << raw.
size();
130 const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
139 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data (data beyond payload size) observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
147 edm::LogWarning(
"Invalid Data") <<
"CRC Error on HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
163 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
168 if (!silent)
edm::LogWarning(
"Invalid Data") <<
"Histogram data passed to non-histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
177 LogDebug(
"HcalTechTrigProcessor") <<
"Skipping data on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId() <<
" which is from the TechTrigProcessor (use separate unpacker!)";
190 htr.
dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
193 int htr_slot=(smid>>1)&0x1F;
194 int htr_cr=(smid>>6)&0x1F;
200 int currFiberChan=0x3F;
212 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
213 if (tp_work->
raw()==0xFFFF)
continue;
215 if (sector>2)
continue;
217 for (
int ibit=0; ibit<8; ibit++) {
218 int linear=sector*8+ibit;
219 if (!unrolled[linear].checked) {
221 int fiber=(linear/3)+1;
225 eid.
setHTR(htr_cr,htr_slot,htr_tb);
230 unrolled[linear].
valid=
true;
238 if (unrolled[linear].valid) {
240 if (tp_work->
raw()&(1<<ibit)) unrolled[linear].
setbit(unrolled[linear].samples);
245 for (
int i=0;
i<24;
i++) {
246 if (unrolled[
i].valid)
252 unrolled[
i].databits));
255 for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
256 if (tp_work->
raw()==0xFFFF)
continue;
266 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
280 if (!tpgSOIbitInUse) colls.
tpCont->back().setPresamples(nps);
289 colls.
tpCont->back().setSample(colls.
tpCont->back().size(),*tp_work);
290 colls.
tpCont->back().setSize(colls.
tpCont->back().size()+1);
293 if (valid && tpgSOIbitInUse &&
isTPGSOI(*tp_work)) {
294 colls.
tpCont->back().setPresamples(ncurr);
313 for (qie_work=qie_begin; qie_work!=qie_end; ) {
314 if (qie_work->
raw()==0xFFFF) {
323 eid.
setHTR(htr_cr,htr_slot,htr_tb);
364 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
374 const unsigned short* ptr_header=daq_first;
375 const unsigned short* ptr_end=daq_last+1;
376 int flavor, error_flags, capid0, channelid;
378 while (ptr_header!=ptr_end) {
379 if (*ptr_header==0xFFFF) {
390 int fiberchan=channelid&0x3;
391 int fiber=((channelid>>2)&0x7)+1;
395 eid.
setHTR(htr_cr,htr_slot,htr_tb);
436 if (!silent)
edm::LogWarning(
"HCAL") <<
"HcalUnpacker: No match found for electronics id :" << eid;
498 if (retval || !htr.
check()) {
499 edm::LogWarning(
"Invalid Data") <<
"Invalid HTR data observed on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
503 edm::LogWarning(
"Invalid Data") <<
"Non-histogram data passed to histogram unpacker on spigot " << spigot <<
" of DCC with source id " << dccHeader->
getSourceId();
509 int htr_slot=(smid>>1)&0x1F;
510 int htr_cr=(smid>>6)&0x1F;
516 for (
int nf=0; nf<2; nf++) {
517 if (f[nf]<0 || (nf==1 && f[0]==f[1]))
continue;
518 for (fc=0; fc<=2; fc++) {
520 eid.
setHTR(htr_cr,htr_slot,htr_tb);
525 edm::LogWarning(
"HCAL") <<
"HcalHistogramUnpacker: No match found for electronics id :" << eid;
534 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)