CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CastorCtdcUnpacker.cc
Go to the documentation of this file.
8 #include <iostream>
10 using namespace std;
11 
12 CastorCtdcUnpacker::CastorCtdcUnpacker(int sourceIdOffset, int beg, int end) : sourceIdOffset_(sourceIdOffset) {
13  if (beg >= 0 && beg <= CastorDataFrame::MAXSAMPLES - 1) {
14  startSample_ = beg;
15  } else {
16  startSample_ = 0;
17  }
18  if (end >= 0 && end <= CastorDataFrame::MAXSAMPLES - 1 && end >= beg) {
19  endSample_ = end;
20  } else {
22  }
23 }
24 
26  const CastorElectronicsMap& emap,
27  CastorRawCollections& colls,
29  if (raw.size() < 16) {
30  edm::LogWarning("Invalid Data") << "Empty/invalid DCC data, size = " << raw.size();
31  return;
32  }
33 
34  // get the CTDC header
35  const CastorCTDCHeader* ctdcHeader = (const CastorCTDCHeader*)(raw.data());
36  int ctdcid = ctdcHeader->getSourceId() - sourceIdOffset_;
37 
38  // space for unpacked data from one COR
40  std::vector<unsigned short> trigdata(CastorCORData::CHANNELS_PER_SPIGOT * CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL);
41  std::vector<unsigned char> preclen(CastorCORData::CHANNELS_PER_SPIGOT);
42  std::vector<unsigned char> triglen(CastorCORData::CHANNELS_PER_SPIGOT);
43 
44  // walk through the COR data...
45  CastorCORData cor;
46  for (int spigot = 0; spigot < CastorCTDCHeader::SPIGOT_COUNT; spigot++) {
47  if (!ctdcHeader->getSpigotPresent(spigot))
48  continue;
49 
50  int retval = ctdcHeader->getSpigotData(spigot, cor, raw.size());
51  if (retval != 0) {
52  if (retval == -1) {
53  edm::LogWarning("Invalid Data") << "Invalid COR data (data beyond payload size) observed on spigot " << spigot
54  << " of CTDC with source id " << ctdcHeader->getSourceId();
55  report.countSpigotFormatError();
56  }
57  continue;
58  }
59  // check
60  if (!cor.check()) {
61  edm::LogWarning("Invalid Data") << "Invalid COR data observed on spigot " << spigot << " of CTDC with source id "
62  << ctdcHeader->getSourceId();
63  report.countSpigotFormatError();
64  continue;
65  }
66  if (cor.isHistogramEvent()) {
67  edm::LogWarning("Invalid Data") << "Histogram data passed to non-histogram unpacker on spigot " << spigot
68  << " of CTDC with source id " << ctdcHeader->getSourceId();
69  continue;
70  }
71  // calculate "real" number of presamples
72  int nps = cor.getNPS() - startSample_;
73 
74  // new: do not use get pointers .. instead make use of CastorCORData::unpack
75 
76  cor.unpack(&(preclen[0]), &(precdata[0]), &(triglen[0]), &(trigdata[0]));
77 
79  int ichan;
80  for (ichan = 0; ichan < CastorCORData::CHANNELS_PER_SPIGOT; ichan++) {
81  if (preclen[ichan] == 0 || preclen[ichan] & 0xc0)
82  continue;
83  int fiber = ichan / 3;
84  int fiberchan = ichan % 3;
85  // lookup the right channel
86  CastorElectronicsId partialEid(fiberchan, fiber + 1, spigot, ctdcid);
87  // does this partial id exist?
89  HcalGenericDetId did;
90  bool found;
91  found = emap.lookup(partialEid, eid, did);
92 
93  if (found) {
95  // set parameters - presamples
96  digi.setPresamples(nps);
97 
98  int ntaken = 0;
99  for (int sample = startSample_; sample <= endSample_; sample++) {
100  digi.setSample(ntaken, precdata[ichan * CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL + sample]);
101  ntaken++;
102  }
103  digi.setSize(ntaken);
104  colls.castorCont->push_back(digi);
105  } else {
106  report.countUnmappedDigi();
107  if (unknownIds_.find(partialEid) == unknownIds_.end()) {
108  edm::LogWarning("CASTOR") << "CastorCtdcUnpacker: No match found for electronics partialEid :" << partialEid;
109  unknownIds_.insert(partialEid);
110  }
111  }
112  }
113  }
114 }
int getSpigotData(int nspigot, CastorCORData &decodeTool, int validSize) const
int getNPS() const
Get the number of presamples in daq data.
static const int CHANNELS_PER_SPIGOT
Definition: CastorCORData.h:16
void setSample(int i, const HcalQIESample &sam)
std::set< CastorElectronicsId > unknownIds_
void unpack(unsigned char *daq_lengths, unsigned short *daq_samples, unsigned char *tp_lengths, unsigned short *tp_samples) const
Obtain the starting and ending pointers for external unpacking of the data.
static const int SPIGOT_COUNT
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
tuple report
Definition: zeeHLT_cff.py:9
const DetId lookup(CastorElectronicsId fId) const
lookup the logical detid associated with the given electronics id
void unpack(const FEDRawData &raw, const CastorElectronicsMap &emap, CastorRawCollections &conts, HcalUnpackerReport &report)
int endSample_
last sample from fed raw data to copy (if present)
static const int MAXIMUM_SAMPLES_PER_CHANNEL
Definition: CastorCORData.h:17
int sourceIdOffset_
number to subtract from the source id to get the dcc id
bool check() const
Check for a good event Requires a minimum length, matching wordcount and length, not an empty event...
int startSample_
first sample from fed raw data to copy
std::vector< CastorDataFrame > * castorCont
bool isHistogramEvent() const
Is this event a histogram event? (do not call standard unpack in this case!!!!!)
bool getSpigotPresent(unsigned int nspigot) const
Read the &quot;PRESENT&quot; bit for this spigot.
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
string end
Definition: dataset.py:937
Readout chain identification for Castor Bits for the readout chain : some names need change! [31:26] ...
CastorCtdcUnpacker(int sourceIdOffset, int beg, int end)
for normal data
Log< level::Warning, false > LogWarning
void setPresamples(int ps)
static const int MAXSAMPLES
int getSourceId() const
void setSize(int size)