CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Private Member Functions | Private Attributes
HcalUnpacker Class Reference

#include <HcalUnpacker.h>

Classes

struct  Collections
 

Public Member Functions

 HcalUnpacker (int sourceIdOffset, int beg, int end)
 for normal data More...
 
 HcalUnpacker (int sourceIdOffset)
 For histograms, no begin and end. More...
 
void setExpectedOrbitMessageTime (int time)
 
void setMode (int mode)
 
void unpack (const FEDRawData &raw, const HcalElectronicsMap &emap, std::vector< HcalHistogramDigi > &histoDigis)
 
void unpack (const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
 

Private Member Functions

void unpackUMNio (const FEDRawData &raw, int slot, Collections &colls)
 
void unpackUTCA (const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
 
void unpackVME (const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
 

Private Attributes

int endSample_
 last sample from fed raw data to copy (if present) More...
 
int expectedOrbitMessageTime_
 Expected orbit bunch time (needed to evaluate time differences) More...
 
int mode_
 
int sourceIdOffset_
 number to subtract from the source id to get the dcc id More...
 
int startSample_
 first sample from fed raw data to copy More...
 
std::set< HcalElectronicsIdunknownIds_
 
std::set< HcalElectronicsIdunknownIdsTrig_
 Recorded to limit number of times a log message is generated. More...
 

Detailed Description

Definition at line 21 of file HcalUnpacker.h.

Constructor & Destructor Documentation

HcalUnpacker::HcalUnpacker ( int  sourceIdOffset,
int  beg,
int  end 
)
inline

for normal data

Definition at line 42 of file HcalUnpacker.h.

42 : sourceIdOffset_(sourceIdOffset), startSample_(beg), endSample_(end), expectedOrbitMessageTime_(-1), mode_(0) { }
int sourceIdOffset_
number to subtract from the source id to get the dcc id
Definition: HcalUnpacker.h:55
int endSample_
last sample from fed raw data to copy (if present)
Definition: HcalUnpacker.h:57
int startSample_
first sample from fed raw data to copy
Definition: HcalUnpacker.h:56
int expectedOrbitMessageTime_
Expected orbit bunch time (needed to evaluate time differences)
Definition: HcalUnpacker.h:58
#define end
Definition: vmac.h:37
HcalUnpacker::HcalUnpacker ( int  sourceIdOffset)
inline

For histograms, no begin and end.

Definition at line 44 of file HcalUnpacker.h.

44 : sourceIdOffset_(sourceIdOffset), startSample_(-1), endSample_(-1), expectedOrbitMessageTime_(-1), mode_(0) { }
int sourceIdOffset_
number to subtract from the source id to get the dcc id
Definition: HcalUnpacker.h:55
int endSample_
last sample from fed raw data to copy (if present)
Definition: HcalUnpacker.h:57
int startSample_
first sample from fed raw data to copy
Definition: HcalUnpacker.h:56
int expectedOrbitMessageTime_
Expected orbit bunch time (needed to evaluate time differences)
Definition: HcalUnpacker.h:58

Member Function Documentation

void HcalUnpacker::setExpectedOrbitMessageTime ( int  time)
inline

Definition at line 45 of file HcalUnpacker.h.

References expectedOrbitMessageTime_, edmIntegrityCheck::report, ntuplemaker::time, and unpack().

Referenced by HcalRawToDigi::HcalRawToDigi().

int expectedOrbitMessageTime_
Expected orbit bunch time (needed to evaluate time differences)
Definition: HcalUnpacker.h:58
void HcalUnpacker::setMode ( int  mode)
inline
void HcalUnpacker::unpack ( const FEDRawData raw,
const HcalElectronicsMap emap,
std::vector< HcalHistogramDigi > &  histoDigis 
)

Definition at line 831 of file HcalUnpacker.cc.

References HcalHTRData::check(), FEDRawData::data(), DetId::det(), runTauDisplay::eid, f, benchmark_cfg::fc, HcalHistogramDigi::getArray(), HcalHTRData::getHistogramFibers(), HcalDCCHeader::getSourceId(), HcalDCCHeader::getSpigotData(), HcalDCCHeader::getSpigotPresent(), HcalHTRData::getSubmodule(), DetId::Hcal, HcalHTRData::isHistogramEvent(), HcalElectronicsMap::lookup(), DetId::null(), HcalElectronicsId::setHTR(), FEDRawData::size(), HcalDCCHeader::SPIGOT_COUNT, DetId::subdetId(), and HcalHTRData::unpackHistogram().

Referenced by HcalHistogramRawToDigi::produce(), HcalRawToDigi::produce(), and setExpectedOrbitMessageTime().

831  {
832 
833  // get the DCC header
834  const HcalDCCHeader* dccHeader=(const HcalDCCHeader*)(raw.data());
835  int dccid=dccHeader->getSourceId()-sourceIdOffset_;
836 
837  // check the summary status
838 
839  // walk through the HTR data...
840  HcalHTRData htr;
841  for (int spigot=0; spigot<HcalDCCHeader::SPIGOT_COUNT; spigot++) {
842  if (!dccHeader->getSpigotPresent(spigot)) continue;
843 
844  int retval=dccHeader->getSpigotData(spigot,htr,raw.size());
845  // check
846  if (retval || !htr.check()) {
847  edm::LogWarning("Invalid Data") << "Invalid HTR data observed on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId();
848  continue;
849  }
850  if (!htr.isHistogramEvent()) {
851  edm::LogWarning("Invalid Data") << "Non-histogram data passed to histogram unpacker on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId();
852  continue;
853  }
854 
855  unsigned int smid=htr.getSubmodule();
856  int htr_tb=smid&0x1;
857  int htr_slot=(smid>>1)&0x1F;
858  int htr_cr=(smid>>6)&0x1F;
859 
860  // find out the fibers
861  int f[2],fc;
862  htr.getHistogramFibers(f[0],f[1]);
863 
864  for (int nf=0; nf<2; nf++) {
865  if (f[nf]<0 || (nf==1 && f[0]==f[1])) continue; // skip if invalid or the same
866  for (fc=0; fc<=2; fc++) {
867  HcalElectronicsId eid(fc,f[nf],spigot,dccid);
868  eid.setHTR(htr_cr,htr_slot,htr_tb);
869  DetId did=emap.lookup(eid);
870 
871  if (did.null() || did.det()!=DetId::Hcal || did.subdetId()==0) {
872  if (unknownIds_.find(eid)==unknownIds_.end()) {
873  edm::LogWarning("HCAL") << "HcalHistogramUnpacker: No match found for electronics id :" << eid;
874  unknownIds_.insert(eid);
875  }
876  continue;
877  }
878  histoDigis.push_back(HcalHistogramDigi(HcalDetId(did))); // add it!
879  HcalHistogramDigi& digi=histoDigis.back();
880 
881  // unpack the four capids
882  for (int capid=0; capid<4; capid++)
883  htr.unpackHistogram(f[nf],fc,capid,digi.getArray(capid));
884 
885  }
886  }
887  }
888 }
std::set< HcalElectronicsId > unknownIds_
Definition: HcalUnpacker.h:60
int sourceIdOffset_
number to subtract from the source id to get the dcc id
Definition: HcalUnpacker.h:55
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
Definition: HcalHTRData.cc:62
void getHistogramFibers(int &a, int &b) const
Get the fiber numbers for the data present in this event (only in histogram mode!) ...
Definition: HcalHTRData.cc:413
int getSpigotData(int nspigot, HcalHTRData &decodeTool, int validSize) const
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
bool unpackHistogram(int fiber, int fiberchan, int capid, unsigned short *histogram) const
Unpack special histogramming mode data.
Definition: HcalHTRData.cc:441
double f[11][100]
bool getSpigotPresent(unsigned int nspigot) const
Read the "PRESENT" bit for this spigot.
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
int getSourceId() const
Definition: HcalDCCHeader.h:32
Definition: DetId.h:18
bool null() const
is this a null id ?
Definition: DetId.h:45
static const int SPIGOT_COUNT
Definition: HcalDCCHeader.h:19
uint16_t * getArray(int capid)
get the array for the specified capid
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
unsigned int getSubmodule() const
Get the HTR submodule number.
Definition: HcalHTRData.cc:331
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
Readout chain identification for Hcal.
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!!!!!)
Definition: HcalHTRData.cc:385
void HcalUnpacker::unpack ( const FEDRawData raw,
const HcalElectronicsMap emap,
Collections conts,
HcalUnpackerReport report,
bool  silent = false 
)

Definition at line 189 of file HcalUnpacker.cc.

References HcalDCCHeader::BOEshouldBeZeroAlways(), FEDRawData::data(), and FEDRawData::size().

190  {
191 
192  if (raw.size()<16) {
193  if (!silent) edm::LogWarning("Invalid Data") << "Empty/invalid data, size = " << raw.size();
194  return;
195  }
196 
197  // get the DCC header
198  const HcalDCCHeader* dccHeader=(const HcalDCCHeader*)(raw.data());
199 
200  if (dccHeader->BOEshouldBeZeroAlways()==0) // also includes uTCA before the common AMC13XG firmware
201  unpackVME(raw,emap,colls,report,silent);
202  else unpackUTCA(raw,emap,colls,report,silent);
203 }
void unpackUTCA(const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
void unpackVME(const FEDRawData &raw, const HcalElectronicsMap &emap, Collections &conts, HcalUnpackerReport &report, bool silent=false)
short BOEshouldBeZeroAlways() const
Definition: HcalDCCHeader.h:50
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
void HcalUnpacker::unpackUMNio ( const FEDRawData raw,
int  slot,
Collections colls 
)
private

Definition at line 890 of file HcalUnpacker.cc.

References hcal::AMC13Header::AMCPayload(), hcal::AMC13Header::AMCSize(), hcal::AMC13Header::AMCSlot(), FEDRawData::data(), data, hcal::AMC13Header::NAMC(), and HcalUnpacker::Collections::umnio.

Referenced by setMode().

890  {
891  const hcal::AMC13Header* amc13=(const hcal::AMC13Header*)(raw.data());
892  int namc=amc13->NAMC();
893  //Find AMC corresponding to uMNio slot
894  for (int iamc=0; iamc<namc; iamc++) {
895  if (amc13->AMCSlot(iamc) == slot) namc = iamc;
896  }
897  if (namc==amc13->NAMC()) {
898  return;
899  }
900  const uint16_t* data = (const uint16_t*)(amc13->AMCPayload(namc));
901  size_t nwords = amc13->AMCSize(namc) * ( sizeof(uint64_t) / sizeof(uint16_t) );
902  *(colls.umnio) = HcalUMNioDigi(data, nwords);
903 
904 }
int AMCSize(int i) const
Definition: AMC13Header.h:37
unsigned long long uint64_t
Definition: Time.h:15
int NAMC() const
Definition: AMC13Header.h:25
int AMCSlot(int i) const
Definition: AMC13Header.h:33
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
const uint64_t * AMCPayload(int i) const
Definition: AMC13Header.cc:4
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
void HcalUnpacker::unpackUTCA ( const FEDRawData raw,
const HcalElectronicsMap emap,
Collections conts,
HcalUnpackerReport report,
bool  silent = false 
)
private

Definition at line 565 of file HcalUnpacker.cc.

References HcalDataFrameContainer< Digi >::addDataFrame(), hcal::AMC13Header::AMCCRCOk(), hcal::AMC13Header::AMCDataPresent(), hcal::AMC13Header::AMCEnabled(), hcal::AMC13Header::AMCId(), hcal::AMC13Header::AMCPayload(), hcal::AMC13Header::AMCSegmented(), hcal::AMC13Header::AMCSize(), hcal::AMC13Header::AMCSlot(), HcalUnpacker::Collections::calibCont, DetId::Calo, HcalUHTRData::const_iterator::channelid(), HcalUnpackerReport::countSpigotFormatError(), HcalUnpackerReport::countUnmappedDigi(), HcalUnpackerReport::countUnmappedTPDigi(), gather_cfg::cout, FEDRawData::data(), DetId::det(), runTauDisplay::eid, HcalUHTRData::const_iterator::flavor(), HcalUnpacker::Collections::hbheCont, DetId::Hcal, HcalBarrel, HcalCalibration, HcalEmpty, HcalEndcap, HcalForward, HcalOther, HcalOuter, HcalUnpacker::Collections::hfCont, HcalUnpacker::Collections::hoCont, mps_fire::i, hcalTTPDigis_cfi::id, HcalUHTRData::const_iterator::isHeader(), HcalElectronicsMap::lookup(), HcalElectronicsMap::lookupTrigger(), hcal::AMC13Header::NAMC(), DetId::null(), HcalUnpacker::Collections::qie10, HcalUnpacker::Collections::qie10ZDC, HcalUnpacker::Collections::qie11, HcalUHTRData::const_iterator::raw(), HcalDataFrameContainer< Digi >::samples(), HcalUHTRData::const_iterator::soi(), hcal::AMC13Header::sourceId(), HcalOtherDetId::subdet(), HcalZDCDetId::SubdetectorId, DetId::subdetId(), HcalUHTRData::const_iterator::technicalDataType(), HcalUnpacker::Collections::tpCont, HcalTrigTowerDetId::Undefined, HcalUHTRData::const_iterator::value(), and HcalUnpacker::Collections::zdcCont.

Referenced by setMode().

566  {
567 
568  const hcal::AMC13Header* amc13=(const hcal::AMC13Header*)(raw.data());
569 
570  // how many AMC in this packet
571  int namc=amc13->NAMC();
572  for (int iamc=0; iamc<namc; iamc++) {
573  // if not enabled, ignore
574  if (!amc13->AMCEnabled(iamc)) continue;
575 
576  if (!amc13->AMCDataPresent(iamc)) {
577  if (!silent)
578  edm::LogWarning("Invalid Data") << "Missing data observed on iamc " << iamc << " of AMC13 with source id " << amc13->sourceId();
579  report.countSpigotFormatError();
580  continue;
581  }
582  if (!amc13->AMCCRCOk(iamc)) {
583  if (!silent)
584  edm::LogWarning("Invalid Data") << "CRC Error on uHTR data observed on iamc " << iamc << " of AMC13 with source id " << amc13->sourceId();
585  report.countSpigotFormatError();
586  // continue;
587  }
588  // this unpacker cannot handle segmented data!
589  if (amc13->AMCSegmented(iamc)) {
590  if (!silent)
591  edm::LogWarning("Invalid Data") << "Unpacker cannot handle segmented data observed on iamc " << iamc << " of AMC13 with source id " << amc13->sourceId();
592  report.countSpigotFormatError();
593  continue;
594  }
595 
596  // ok, now we're work-able
597  int slot=amc13->AMCSlot(iamc);
598  int crate=amc13->AMCId(iamc)&0xFF;
599  // this is used only for the 1.6 Gbps link data
600  int nps=(amc13->AMCId(iamc)>>12)&0xF;
601 
602  HcalUHTRData uhtr(amc13->AMCPayload(iamc),amc13->AMCSize(iamc));
603  //Check to make sure uMNio is not unpacked here
604  if(uhtr.getFormatVersion() != 1) {
605  unpackUMNio(raw, slot, colls);
606  }
607 #ifdef DebugLog
608  //debug printouts
609  int nwords=uhtr.getRawLengthBytes()/2;
610  for (int iw=0; iw<nwords; iw++)
611  printf("%04d %04x\n",iw,uhtr.getRawData16()[iw]);
612 #endif
613 
614  //use uhtr presamples since amc header not properly packed in simulation
615  nps = uhtr.presamples();
616  HcalUHTRData::const_iterator i=uhtr.begin(), iend=uhtr.end();
617  while (i!=iend) {
618 #ifdef DebugLog
619  std::cout << "This data is flavored:" << i.flavor() << std::endl;
620 #endif
621 
622  if (!i.isHeader()) {
623  ++i;
624 #ifdef DebugLog
625  std::cout << "its not a header" << std::endl;
626 #endif
627  continue;
628  }
630  if (i.flavor() == 1 || i.flavor() == 0) {
631  int ifiber=((i.channelid()>>3)&0x1F);
632  int ichan=(i.channelid()&0x7);
633  HcalElectronicsId eid(crate,slot,ifiber,ichan, false);
634  DetId did=emap.lookup(eid);
635  // Count from current position to next header, or equal to end
636  const uint16_t* head_pos = i.raw();
637  int ns = 0;
638  for (++i; i != iend && !i.isHeader(); ++i) {
639  ns++;
640  }
641  // Check QEI11 container exists
642  if (colls.qie11 == 0) {
643  colls.qie11 = new QIE11DigiCollection(ns);
644  }
645  else if (colls.qie11->samples() != ns) {
646  // This is horrible
647  edm::LogError("Invalid Data") << "QIE11 Collection has " << colls.qie11->samples() << " samples per digi, raw data has " << ns << "!";
648  return;
649  }
650 
651  // Insert data
653  if (!did.null()) { // unpack and store...
654  colls.qie11->addDataFrame(did, head_pos);
655  } else {
656  report.countUnmappedDigi(eid);
657  if (unknownIds_.find(eid)==unknownIds_.end()) {
658  if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No match found for electronics id :" << eid;
659  unknownIds_.insert(eid);
660 #ifdef DebugLog
661  std::cout << "HcalUnpacker: No match found for electronics id :" << eid << std::endl;
662 #endif
663  }
664 #ifdef DebugLog
665  std::cout << "OH NO! detector id is null!" << std::endl;
666 #endif
667  }
668  } else if (i.flavor() == 2){
670 
671  int ifiber=((i.channelid()>>3)&0x1F);
672  int ichan=(i.channelid()&0x7);
673  HcalElectronicsId eid(crate,slot,ifiber,ichan, false);
674  DetId did=emap.lookup(eid);
675 
676  // Count from current position to next header, or equal to end
677  const uint16_t* head_pos = i.raw();
678  int ns = 0;
679  for (++i; i != iend && !i.isHeader(); ++i) {
680  ns++;
681  }
682 
683  // Check QEI10 container exists
684  if (colls.qie10ZDC == 0) {
685  colls.qie10ZDC = new QIE10DigiCollection(ns);
686  }
687  else if (colls.qie10ZDC->samples() != ns) {
688  // This is horrible
689  edm::LogError("Invalid Data") << "QIE10ZDC Collection has " << colls.qie10ZDC->samples() << " samples per digi, raw data has " << ns << "!";
690  return;
691  }
692 
693  if (colls.qie10 == 0) {
694  colls.qie10 = new QIE10DigiCollection(ns);
695  }
696  else if (colls.qie10->samples() != ns) {
697  // This is horrible
698  edm::LogError("Invalid Data") << "QIE10 Collection has " << colls.qie10->samples() << " samples per digi, raw data has " << ns << "!";
699  return;
700  }
701 
702  // Insert data
704  if (!did.null() && did.det()==DetId::Calo && did.subdetId()==HcalZDCDetId::SubdetectorId) { // unpack and store...
705  colls.qie10ZDC->addDataFrame(did, head_pos);
706  }
707  else if (!did.null()) { // unpack and store...
708  colls.qie10->addDataFrame(did, head_pos);
709  } else {
710  report.countUnmappedDigi(eid);
711  if (unknownIds_.find(eid)==unknownIds_.end()) {
712  if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No match found for electronics id :" << eid;
713  unknownIds_.insert(eid);
714 #ifdef DebugLog
715  std::cout << "HcalUnpacker: No match found for electronics id :" << eid << std::endl;
716 #endif
717  }
718 #ifdef DebugLog
719  std::cout << "OH NO! HcalUnpacker: No match found for electronics id :" << eid << std::endl;
720 #endif
721  }
722  }
723  else if (i.flavor()==5 || (i.flavor()==7 && i.technicalDataType()==15)) { // Old-style digis
724  int ifiber=((i.channelid()>>2)&0x1F);
725  int ichan=(i.channelid()&0x3);
726  HcalElectronicsId eid(crate,slot,ifiber,ichan, false);
727  DetId did=emap.lookup(eid);
728 
729  if (!did.null()) { // unpack and store...
730  if (did.det()==DetId::Calo && did.subdetId()==HcalZDCDetId::SubdetectorId) {
731  colls.zdcCont->push_back(ZDCDataFrame(HcalZDCDetId(did)));
732  HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(i,iend, colls.zdcCont->back(), nps, eid, startSample_, endSample_);
733  } else if (did.det()==DetId::Hcal) {
734  switch (((HcalSubdetector)did.subdetId())) {
735  case (HcalBarrel):
736  case (HcalEndcap): {
737  colls.hbheCont->push_back(HBHEDataFrame(HcalDetId(did)));
738  HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(i, iend, colls.hbheCont->back(), nps, eid, startSample_, endSample_);
739  } break;
740  case (HcalOuter): {
741  colls.hoCont->push_back(HODataFrame(HcalDetId(did)));
742  HcalUnpacker_impl::unpack_compact<HODataFrame>(i, iend, colls.hoCont->back(), nps, eid, startSample_, endSample_);
743  } break;
744  case (HcalForward): {
745  colls.hfCont->push_back(HFDataFrame(HcalDetId(did)));
746  HcalUnpacker_impl::unpack_compact<HFDataFrame>(i, iend, colls.hfCont->back(), nps, eid, startSample_, endSample_);
747  } break;
748  case (HcalOther) : {
749  HcalOtherDetId odid(did);
750  if (odid.subdet()==HcalCalibration) {
751  colls.calibCont->push_back(HcalCalibDataFrame(HcalCalibDetId(did)));
752  HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(i, iend, colls.calibCont->back(), nps, eid, startSample_, endSample_);
753  }
754  } break;
755  case (HcalEmpty):
756  default: {
757  for (++i;
758  i!=iend && !i.isHeader();
759  ++i);
760  }
761  break;
762  }
763  }
764  } else {
765  report.countUnmappedDigi(eid);
766  if (unknownIds_.find(eid)==unknownIds_.end()) {
767  if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No match found for electronics id :" << eid;
768  unknownIds_.insert(eid);
769  }
770  for (++i;
771  i!=iend && !i.isHeader();
772  ++i);
773  }
774  } else if (i.flavor()==0x4) { // TP digis
775  int ilink=((i.channelid()>>4)&0xF);
776  int itower=(i.channelid()&0xF);
777  HcalElectronicsId eid(crate,slot,ilink,itower,true);
778  DetId did=emap.lookupTrigger(eid);
779 #ifdef DebugLog
780  std::cout << "Unpacking " << eid << " " << i.channelid() << std::endl;
781 #endif
782  if (did.null()) {
783  report.countUnmappedTPDigi(eid);
784  if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) {
785  if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No trigger primitive match found for electronics id :" << eid;
786  unknownIdsTrig_.insert(eid);
787  }
788  // Skip it
789  for (++i; i!=iend && !i.isHeader(); ++i);
790  } else if (did==HcalTrigTowerDetId::Undefined ||
791  (did.det()==DetId::Hcal && did.subdetId()==0)) {
792  for (++i; i!=iend && !i.isHeader(); ++i);
793  } else {
794  HcalTrigTowerDetId id(did);
795 #ifdef DebugLog
796  std::cout << "Unpacking " << id << std::endl;
797 #endif
798  colls.tpCont->push_back(HcalTriggerPrimitiveDigi(id));
799  int j=0;
800  for (++i; i!=iend && !i.isHeader(); ++i) {
801  colls.tpCont->back().setSample(j,i.value());
802  if (i.soi()) colls.tpCont->back().setPresamples(j);
803  j++;
804  }
805  colls.tpCont->back().setSize(j);
806  }
807  } else {
808  // consume any not-understood channel data
809  for (++i;
810  i!=iend && !i.isHeader();
811  ++i);
812  }
813  }
814  }
815 }
std::set< HcalElectronicsId > unknownIds_
Definition: HcalUnpacker.h:60
int endSample_
last sample from fed raw data to copy (if present)
Definition: HcalUnpacker.h:57
int startSample_
first sample from fed raw data to copy
Definition: HcalUnpacker.h:56
int AMCSize(int i) const
Definition: AMC13Header.h:37
HcalDataFrameContainer< QIE10DataFrame > QIE10DigiCollection
bool AMCDataPresent(int i) const
Definition: AMC13Header.h:47
HcalSubdetector
Definition: HcalAssistant.h:31
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
std::set< HcalElectronicsId > unknownIdsTrig_
Recorded to limit number of times a log message is generated.
Definition: HcalUnpacker.h:60
HcalDataFrameContainer< QIE11DataFrame > QIE11DigiCollection
Definition: DetId.h:18
static const int SubdetectorId
Definition: HcalZDCDetId.h:25
int sourceId() const
Definition: AMC13Header.h:15
bool null() const
is this a null id ?
Definition: DetId.h:45
static const HcalTrigTowerDetId Undefined
bool AMCSegmented(int i) const
Definition: AMC13Header.h:41
int NAMC() const
Definition: AMC13Header.h:25
int AMCSlot(int i) const
Definition: AMC13Header.h:33
const uint64_t * AMCPayload(int i) const
Definition: AMC13Header.cc:4
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
bool AMCCRCOk(int i) const
Definition: AMC13Header.h:45
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
bool AMCEnabled(int i) const
Definition: AMC13Header.h:51
void unpackUMNio(const FEDRawData &raw, int slot, Collections &colls)
uint16_t AMCId(int i) const
Definition: AMC13Header.h:31
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
const uint16_t * raw() const
Definition: HcalUHTRData.h:68
Readout chain identification for Hcal.
const DetId lookup(HcalElectronicsId fId) const
lookup the logical detid associated with the given electronics id
void HcalUnpacker::unpackVME ( const FEDRawData raw,
const HcalElectronicsMap emap,
Collections conts,
HcalUnpackerReport report,
bool  silent = false 
)
private

work through the samples

branch point between 2006-2011 data format and 2012+ data format

work through the samples

Definition at line 210 of file HcalUnpacker.cc.

References HcalUnpacker::Collections::calibCont, DetId::Calo, HcalHTRData::check(), HOUnrolledTP::checked, HcalUnpackerReport::countBusySpigot(), HcalUnpackerReport::countEmptyEventSpigot(), HcalUnpackerReport::countOFWSpigot(), HcalUnpackerReport::countSpigotFormatError(), HcalUnpackerReport::countUnmappedDigi(), HcalUnpackerReport::countUnmappedTPDigi(), FEDRawData::data(), HcalHTRData::dataPointers(), DetId::det(), runTauDisplay::eid, benchmark_cfg::fc, HcalQIESample::fiber(), HcalQIESample::fiberAndChan(), HcalQIESample::fiberChan(), HcalHTRData::FORMAT_VERSION_COMPACT_DATA, HcalDCCHeader::getDCCDataFormatVersion(), HcalHTRData::getFirmwareFlavor(), HcalHTRData::getFormatVersion(), HcalHTRData::getNPS(), HcalDTCHeader::getSlotCRCError(), HcalDTCHeader::getSlotData(), HcalDTCHeader::getSlotPresent(), HcalDCCHeader::getSourceId(), HcalDTCHeader::getSourceId(), HcalDCCHeader::getSpigotCRCError(), HcalDCCHeader::getSpigotData(), HcalDCCHeader::getSpigotPresent(), HcalHTRData::getSubmodule(), HcalUnpacker::Collections::hbheCont, DetId::Hcal, HcalBarrel, HcalCalibration, HcalEmpty, HcalEndcap, HcalForward, HcalOther, HcalOuter, HcalUnpacker::Collections::hfCont, HcalUnpacker::Collections::hoCont, mps_fire::i, hcalTTPDigis_cfi::id, HcalDetId::ieta(), HOUnrolledTP::ieta, HcalDetId::iphi(), HOUnrolledTP::iphi, HcalHTRData::is_channel_header(), HcalHTRData::isBusy(), HcalHTRData::isEmptyEvent(), HcalHTRData::isHistogramEvent(), HcalHTRData::isOverflowWarning(), isTPGSOI(), HcalHTRData::isUnsuppressed(), linear(), LogDebug, HcalElectronicsMap::lookup(), HcalElectronicsMap::lookupTrigger(), HcalDTCHeader::MAXIMUM_SLOT, DetId::null(), HcalTriggerPrimitiveSample::raw(), HcalQIESample::raw(), hcalTTPDigis_cfi::samples, HOUnrolledTP::samples, HOUnrolledTP::setbit(), HcalElectronicsId::setHTR(), FEDRawData::size(), slb(), slbAndChan(), slbChan(), HOUnrolledTP::soi, HcalDCCHeader::SPIGOT_COUNT, HcalOtherDetId::subdet(), HcalZDCDetId::SubdetectorId, DetId::subdetId(), HcalUnpacker::Collections::tpCont, HcalUnpacker::Collections::tphoCont, HcalUnpacker::Collections::ttp, HcalTrigTowerDetId::Undefined, HcalTTPUnpacker::unpack(), HcalHTRData::unpack_per_channel_header(), HOUnrolledTP::valid, HcalHTRData::wasMarkAndPassZSTP(), and HcalUnpacker::Collections::zdcCont.

Referenced by setMode().

211  {
212 
213  // get the DCC header
214  const HcalDCCHeader* dccHeader=(const HcalDCCHeader*)(raw.data());
215  const HcalDTCHeader* dtcHeader=(const HcalDTCHeader*)(raw.data());
216  bool is_VME_DCC=(dccHeader->getDCCDataFormatVersion()<0x10) || ((mode_&0x1)==0);
217 
218  int dccid=(is_VME_DCC)?(dccHeader->getSourceId()-sourceIdOffset_):(dtcHeader->getSourceId()-sourceIdOffset_);
219 
220  // check the summary status
221 
222  // walk through the HTR data. For the uTCA, use spigot=slot+1
223  HcalHTRData htr;
224  const unsigned short* daq_first, *daq_last, *tp_first, *tp_last;
225  const HcalQIESample* qie_begin, *qie_end, *qie_work;
226  const HcalTriggerPrimitiveSample *tp_begin, *tp_end, *tp_work;
227  for (int spigot=0; spigot<HcalDCCHeader::SPIGOT_COUNT; spigot++) {
228 
229  if (is_VME_DCC) {
230  if (!dccHeader->getSpigotPresent(spigot)) continue;
231 
232  int retval=dccHeader->getSpigotData(spigot,htr,raw.size());
233  if (retval!=0) {
234  if (retval==-1) {
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();
236  report.countSpigotFormatError();
237  }
238  continue;
239  }
240  // check
241  if (dccHeader->getSpigotCRCError(spigot)) {
242  if (!silent)
243  edm::LogWarning("Invalid Data") << "CRC Error on HTR data observed on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId();
244  report.countSpigotFormatError();
245  continue;
246  }
247  } else { // is_uTCA (!is_VME_DCC)
248  int slot=spigot+1;
249  if (slot>HcalDTCHeader::MAXIMUM_SLOT) continue;
250 
251  if (!dtcHeader->getSlotPresent(slot)) continue;
252 
253  int retval=dtcHeader->getSlotData(slot,htr,raw.size());
254  if (retval!=0) {
255  if (retval==-1) {
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();
257  report.countSpigotFormatError();
258  }
259  continue;
260  }
261  // check
262  if (dtcHeader->getSlotCRCError(slot)) {
263  if (!silent)
264  edm::LogWarning("Invalid Data") << "CRC Error on uHTR data observed on slot " << slot << " of DTC with source id " << dtcHeader->getSourceId();
265  report.countSpigotFormatError();
266  continue;
267  }
268  }
269 
270 
271  // check for EE
272  if (htr.isEmptyEvent()) {
273  report.countEmptyEventSpigot();
274  }
275  if (htr.isOverflowWarning()) {
276  report.countOFWSpigot();
277  }
278  if (htr.isBusy()) {
279  report.countBusySpigot();
280  }
281  if (!htr.check()) {
282  if (!silent)
283  edm::LogWarning("Invalid Data") << "Invalid HTR data observed on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId();
284  report.countSpigotFormatError();
285  continue;
286  }
287  if (htr.isHistogramEvent()) {
288  if (!silent) edm::LogWarning("Invalid Data") << "Histogram data passed to non-histogram unpacker on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId();
289  continue;
290  }
291  if ((htr.getFirmwareFlavor()&0xE0)==0x80) { // some kind of TTP data
292  if (colls.ttp!=0) {
293  HcalTTPUnpacker ttpUnpack;
294  colls.ttp->push_back(HcalTTPDigi());
295  ttpUnpack.unpack(htr,colls.ttp->back());
296  } else {
297  LogDebug("HcalTechTrigProcessor") << "Skipping data on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId() << " which is from the TechTrigProcessor (use separate unpacker!)";
298  }
299  continue;
300  }
301  if (htr.getFirmwareFlavor()>=0x80) {
302  if (!silent) edm::LogWarning("HcalUnpacker") << "Skipping data on spigot " << spigot << " of DCC with source id " << dccHeader->getSourceId() << " which is of unknown flavor " << htr.getFirmwareFlavor();
303  continue;
304  }
305 
306  // calculate "real" number of presamples
307  int nps=htr.getNPS()-startSample_;
308 
309  // get pointers
310  htr.dataPointers(&daq_first,&daq_last,&tp_first,&tp_last);
311  unsigned int smid=htr.getSubmodule();
312  int htr_tb=smid&0x1;
313  int htr_slot=(smid>>1)&0x1F;
314  int htr_cr=(smid>>6)&0x1F;
315 
316  tp_begin=(const HcalTriggerPrimitiveSample*)tp_first;
317  tp_end=(const HcalTriggerPrimitiveSample*)(tp_last+1); // one beyond last..
318 
320  int currFiberChan=0x3F; // invalid fiber+channel...
321  int ncurr=0;
322  bool valid=false;
323 
324  bool tpgSOIbitInUse=htr.getFormatVersion()>=3; // version 3 and later
325  bool isHOtpg=htr.getFormatVersion()>=3 && htr.getFirmwareFlavor()==0; // HO is flavor zero
326  int npre=0;
327  /*
328  Unpack the trigger primitives
329  */
330  if (isHOtpg) {
331  HOUnrolledTP unrolled[24];
332  for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
333  if (tp_work->raw()==0xFFFF) continue; // filler word
334  int sector=slbChan(tp_work->raw());
335  if (sector>2) continue;
336 
337  for (int ibit=0; ibit<8; ibit++) {
338  int linear=sector*8+ibit;
339  if (!unrolled[linear].checked) {
340  unrolled[linear].checked=true;
341  int fiber=(linear/3)+1;
342  int fc=(linear%3);
343  // electronics id (use precision match for HO TP)
344  HcalElectronicsId eid(fc,fiber,spigot,dccid);
345  eid.setHTR(htr_cr,htr_slot,htr_tb);
346  DetId did=emap.lookup(eid);
347  if (!did.null()) {
348  if (did.det()==DetId::Hcal && ((HcalSubdetector)did.subdetId())==HcalOuter ) {
349  HcalDetId hid(did);
350  unrolled[linear].valid=true;
351  unrolled[linear].ieta=hid.ieta();
352  unrolled[linear].iphi=hid.iphi();
353  }
354  } else {
355  report.countUnmappedTPDigi(eid);
356  }
357  }
358  if (unrolled[linear].valid) {
359  if (isTPGSOI(*tp_work)) unrolled[linear].soi=unrolled[linear].samples;
360  if (tp_work->raw()&(1<<ibit)) unrolled[linear].setbit(unrolled[linear].samples);
361  unrolled[linear].samples++;
362  }
363  }
364  }
365  for (int i=0; i<24; i++) {
366  if (unrolled[i].valid)
367  colls.tphoCont->push_back(HOTriggerPrimitiveDigi(
368  unrolled[i].ieta,
369  unrolled[i].iphi,
370  unrolled[i].samples,
371  unrolled[i].soi,
372  unrolled[i].databits));
373  }
374  } else { // regular TPs (not HO)
375  for (tp_work=tp_begin; tp_work!=tp_end; tp_work++) {
376  if (tp_work->raw()==0xFFFF) continue; // filler word
377  if (slbAndChan(tp_work->raw())!=currFiberChan) { // start new set
378  npre=0;
379  currFiberChan=slbAndChan(tp_work->raw());
380  // lookup the right channel
381  HcalElectronicsId eid(slbChan(tp_work->raw()),slb(tp_work->raw()),spigot,dccid,htr_cr,htr_slot,htr_tb);
382  DetId did=emap.lookupTrigger(eid);
383  if (did.null()) {
384  report.countUnmappedTPDigi(eid);
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);
388  }
389  valid=false;
390  continue;
391  } else if (did==HcalTrigTowerDetId::Undefined ||
392  (did.det()==DetId::Hcal && did.subdetId()==0)) {
393  // known to be unmapped
394  valid=false;
395  continue;
396  }
397  HcalTrigTowerDetId id(did);
398  colls.tpCont->push_back(HcalTriggerPrimitiveDigi(id));
399  // set the various bits
400  if (!tpgSOIbitInUse) colls.tpCont->back().setPresamples(nps);
401  colls.tpCont->back().setZSInfo(htr.isUnsuppressed(),htr.wasMarkAndPassZSTP(slb(tp_work->raw()),slbChan(tp_work->raw())));
402 
403  // no hits recorded for current
404  ncurr=0;
405  valid=true;
406  }
407  // add the word (if within settings or recent firmware [recent firmware ignores startSample/endSample])
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);
411  }
412  // set presamples,if SOI
413  if (valid && tpgSOIbitInUse && isTPGSOI(*tp_work)) {
414  colls.tpCont->back().setPresamples(ncurr);
415  }
416  ncurr++;
417  npre++;
418  }
419  }
420 
423 
424  qie_begin=(const HcalQIESample*)daq_first;
425  qie_end=(const HcalQIESample*)(daq_last+1); // one beyond last..
426 
428 
429 
430  for (qie_work=qie_begin; qie_work!=qie_end; ) {
431  if (qie_work->raw()==0xFFFF) {
432  qie_work++;
433  continue; // filler word
434  }
435  // always at the beginning ...
436 
437  // lookup the right channel
438  HcalElectronicsId eid(qie_work->fiberChan(),qie_work->fiber(),spigot,dccid);
439  eid.setHTR(htr_cr,htr_slot,htr_tb);
440  DetId did=emap.lookup(eid);
441 
442  if (!did.null()) {
443  if (did.det()==DetId::Calo && did.subdetId()==HcalZDCDetId::SubdetectorId) {
444  colls.zdcCont->push_back(ZDCDataFrame(HcalZDCDetId(did)));
445  qie_work=HcalUnpacker_impl::unpack<ZDCDataFrame>(qie_work, qie_end, colls.zdcCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
446  } else if (did.det()==DetId::Hcal) {
447  switch (((HcalSubdetector)did.subdetId())) {
448  case (HcalBarrel):
449  case (HcalEndcap): {
450  colls.hbheCont->push_back(HBHEDataFrame(HcalDetId(did)));
451  qie_work=HcalUnpacker_impl::unpack<HBHEDataFrame>(qie_work, qie_end, colls.hbheCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
452  } break;
453  case (HcalOuter): {
454  colls.hoCont->push_back(HODataFrame(HcalDetId(did)));
455  qie_work=HcalUnpacker_impl::unpack<HODataFrame>(qie_work, qie_end, colls.hoCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
456  } break;
457  case (HcalForward): {
458  colls.hfCont->push_back(HFDataFrame(HcalDetId(did)));
459  qie_work=HcalUnpacker_impl::unpack<HFDataFrame>(qie_work, qie_end, colls.hfCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
460  } break;
461  case (HcalOther) : {
462  HcalOtherDetId odid(did);
463  if (odid.subdet()==HcalCalibration) {
464  colls.calibCont->push_back(HcalCalibDataFrame(HcalCalibDetId(did)));
465  qie_work=HcalUnpacker_impl::unpack<HcalCalibDataFrame>(qie_work, qie_end, colls.calibCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
466  }
467  } break;
468  case (HcalEmpty):
469  default: {
470  for (int fiberC=qie_work->fiberAndChan();
471  qie_work!=qie_end && qie_work->fiberAndChan()==fiberC;
472  qie_work++);
473  }
474  break;
475  }
476  }
477  } else {
478  report.countUnmappedDigi(eid);
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);
482  }
483  for (int fiberC=qie_work->fiberAndChan();
484  qie_work!=qie_end && qie_work->fiberAndChan()==fiberC;
485  qie_work++);
486  }
487  }
488  } else {
489  // this is the branch for unpacking the compact data format with per-channel headers
490  const unsigned short* ptr_header=daq_first;
491  const unsigned short* ptr_end=daq_last+1;
492  int flavor, error_flags, capid0, channelid;
493 
494  while (ptr_header!=ptr_end) {
495  if (*ptr_header==0xFFFF) { // impossible filler word
496  ptr_header++;
497  continue;
498  }
499  // unpack the header word
500  bool isheader=HcalHTRData::unpack_per_channel_header(*ptr_header,flavor,error_flags,capid0,channelid);
501  if (!isheader) {
502  ptr_header++;
503  continue;
504  }
505 
506  int fiberchan=channelid&0x3;
507  int fiber=((channelid>>2)&0x7)+1;
508 
509  // lookup the right channel
510  HcalElectronicsId eid(fiberchan,fiber,spigot,dccid);
511  eid.setHTR(htr_cr,htr_slot,htr_tb);
512  DetId did=emap.lookup(eid);
513 
514  if (!did.null()) {
515  if (did.det()==DetId::Calo && did.subdetId()==HcalZDCDetId::SubdetectorId) {
516  colls.zdcCont->push_back(ZDCDataFrame(HcalZDCDetId(did)));
517  ptr_header=HcalUnpacker_impl::unpack_compact<ZDCDataFrame>(ptr_header, ptr_end, colls.zdcCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
518  } else if (did.det()==DetId::Hcal) {
519  switch (((HcalSubdetector)did.subdetId())) {
520  case (HcalBarrel):
521  case (HcalEndcap): {
522  colls.hbheCont->push_back(HBHEDataFrame(HcalDetId(did)));
523  ptr_header=HcalUnpacker_impl::unpack_compact<HBHEDataFrame>(ptr_header, ptr_end, colls.hbheCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
524  } break;
525  case (HcalOuter): {
526  colls.hoCont->push_back(HODataFrame(HcalDetId(did)));
527  ptr_header=HcalUnpacker_impl::unpack_compact<HODataFrame>(ptr_header, ptr_end, colls.hoCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
528  } break;
529  case (HcalForward): {
530  colls.hfCont->push_back(HFDataFrame(HcalDetId(did)));
531  ptr_header=HcalUnpacker_impl::unpack_compact<HFDataFrame>(ptr_header, ptr_end, colls.hfCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
532  } break;
533  case (HcalOther) : {
534  HcalOtherDetId odid(did);
535  if (odid.subdet()==HcalCalibration) {
536  colls.calibCont->push_back(HcalCalibDataFrame(HcalCalibDetId(did)));
537  ptr_header=HcalUnpacker_impl::unpack_compact<HcalCalibDataFrame>(ptr_header, ptr_end, colls.calibCont->back(), nps, eid, startSample_, endSample_, expectedOrbitMessageTime_, htr);
538  }
539  } break;
540  case (HcalEmpty):
541  default: {
542  for (ptr_header++;
543  ptr_header!=ptr_end && !HcalHTRData::is_channel_header(*ptr_header);
544  ptr_header++);
545  }
546  break;
547  }
548  }
549  } else {
550  report.countUnmappedDigi(eid);
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);
554  }
555  for (ptr_header++;
556  ptr_header!=ptr_end && !HcalHTRData::is_channel_header(*ptr_header);
557  ptr_header++);
558  }
559  }
560 
561  }
562  }
563 }
#define LogDebug(id)
int getSourceId() const
Definition: HcalDTCHeader.h:35
std::set< HcalElectronicsId > unknownIds_
Definition: HcalUnpacker.h:60
int sourceIdOffset_
number to subtract from the source id to get the dcc id
Definition: HcalUnpacker.h:55
int endSample_
last sample from fed raw data to copy (if present)
Definition: HcalUnpacker.h:57
int startSample_
first sample from fed raw data to copy
Definition: HcalUnpacker.h:56
uint16_t raw() const
get the raw word
Definition: HcalQIESample.h:20
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
Definition: HcalHTRData.cc:62
static int slbAndChan(uint16_t theSample)
int fiberChan() const
get the fiber channel number
Definition: HcalQIESample.h:34
bool getSpigotCRCError(unsigned int nspigot) const
Read the "CRC-Mismatch" bit for this spigot.
static bool isTPGSOI(const HcalTriggerPrimitiveSample &s)
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)
Definition: HcalHTRData.cc:433
int getSpigotData(int nspigot, HcalHTRData &decodeTool, int validSize) const
int getFormatVersion() const
Get the version number of this event.
Definition: HcalHTRData.h:33
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
bool isUnsuppressed() const
Is this event an unsuppresed event?
Definition: HcalHTRData.cc:353
bool isOverflowWarning() const
Definition: HcalHTRData.cc:109
static bool is_channel_header(unsigned short value)
check top bit to see if this is a compact format channel header word
Definition: HcalHTRData.h:90
int expectedOrbitMessageTime_
Expected orbit bunch time (needed to evaluate time differences)
Definition: HcalUnpacker.h:58
bool isEmptyEvent() const
Definition: HcalHTRData.cc:100
HcalSubdetector
Definition: HcalAssistant.h:31
uint16_t raw() const
get the raw word
int fiber() const
get the fiber number
Definition: HcalQIESample.h:32
bool getSpigotPresent(unsigned int nspigot) const
Read the "PRESENT" bit for this spigot.
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
bool getSlotPresent(unsigned int nslot) const
Read the "PRESENT" bit for this slot.
Definition: HcalDTCHeader.h:80
std::set< HcalElectronicsId > unknownIdsTrig_
Recorded to limit number of times a log message is generated.
Definition: HcalUnpacker.h:60
int getSourceId() const
Definition: HcalDCCHeader.h:32
Definition: DetId.h:18
static const int SubdetectorId
Definition: HcalZDCDetId.h:25
static int slb(uint16_t theSample)
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.
Definition: HcalHTRData.cc:153
bool unpack(const HcalHTRData &data, HcalTTPDigi &digi)
bool null() const
is this a null id ?
Definition: DetId.h:45
void setbit(int i)
int getNPS() const
Get the number of presamples in daq data.
Definition: HcalHTRData.cc:400
static const HcalTrigTowerDetId Undefined
static const int FORMAT_VERSION_COMPACT_DATA
Definition: HcalHTRData.h:20
int getFirmwareFlavor() const
Get the HTR firmware flavor.
Definition: HcalHTRData.cc:409
static const int SPIGOT_COUNT
Definition: HcalDCCHeader.h:19
int getSlotData(int nslot, HcalHTRData &decodeTool, int validSize) const
bool wasMarkAndPassZSTP(int slb, int slbchan) const
Was this channel passed as part of Mark&Pass ZS?
Definition: HcalHTRData.cc:364
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
const DetId lookupTrigger(HcalElectronicsId fId) const
brief lookup the trigger logical detid associated with the given electronics id
short getDCCDataFormatVersion() const
Definition: HcalDCCHeader.h:57
unsigned int getSubmodule() const
Get the HTR submodule number.
Definition: HcalHTRData.cc:331
bool isBusy() const
Definition: HcalHTRData.cc:117
float linear(float x)
Detector det() const
get the detector field from this detid
Definition: DetId.h:35
Readout chain identification for Hcal.
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!!!!!)
Definition: HcalHTRData.cc:385
static const int MAXIMUM_SLOT
Definition: HcalDTCHeader.h:22
bool getSlotCRCError(unsigned int nslot) const
Read the "CRC-Mismatch" bit for this slot.
Definition: HcalDTCHeader.h:84
static int slbChan(uint16_t theSample)

Member Data Documentation

int HcalUnpacker::endSample_
private

last sample from fed raw data to copy (if present)

Definition at line 57 of file HcalUnpacker.h.

int HcalUnpacker::expectedOrbitMessageTime_
private

Expected orbit bunch time (needed to evaluate time differences)

Definition at line 58 of file HcalUnpacker.h.

Referenced by setExpectedOrbitMessageTime().

int HcalUnpacker::mode_
private

Definition at line 59 of file HcalUnpacker.h.

Referenced by setMode().

int HcalUnpacker::sourceIdOffset_
private

number to subtract from the source id to get the dcc id

Definition at line 55 of file HcalUnpacker.h.

int HcalUnpacker::startSample_
private

first sample from fed raw data to copy

Definition at line 56 of file HcalUnpacker.h.

std::set<HcalElectronicsId> HcalUnpacker::unknownIds_
private

Definition at line 60 of file HcalUnpacker.h.

std::set<HcalElectronicsId> HcalUnpacker::unknownIdsTrig_
private

Recorded to limit number of times a log message is generated.

Definition at line 60 of file HcalUnpacker.h.