Go to the documentation of this file.00001 #include "EventFilter/CastorRawToDigi/interface/CastorCtdcUnpacker.h"
00002 #include "EventFilter/CastorRawToDigi/interface/CastorCTDCHeader.h"
00003 #include "EventFilter/CastorRawToDigi/interface/CastorCORData.h"
00004 #include "DataFormats/HcalDetId/interface/HcalOtherDetId.h"
00005 #include "DataFormats/HcalDigi/interface/HcalQIESample.h"
00006 #include "DataFormats/HcalDigi/interface/CastorDataFrame.h"
00007 #include "DataFormats/HcalDigi/interface/HcalTriggerPrimitiveSample.h"
00008 #include <iostream>
00009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00010 using namespace std;
00011
00012 CastorCtdcUnpacker::CastorCtdcUnpacker(int sourceIdOffset, int beg, int end) : sourceIdOffset_(sourceIdOffset)
00013 {
00014 if ( beg >= 0 && beg <= CastorDataFrame::MAXSAMPLES -1 ) {
00015 startSample_ = beg;
00016 } else {
00017 startSample_ = 0;
00018 }
00019 if ( end >= 0 && end <= CastorDataFrame::MAXSAMPLES -1 && end >= beg ) {
00020 endSample_ = end;
00021 } else {
00022 endSample_ = CastorDataFrame::MAXSAMPLES -1;
00023 }
00024 }
00025
00026
00027 void CastorCtdcUnpacker::unpack(const FEDRawData& raw, const CastorElectronicsMap& emap,
00028 CastorRawCollections& colls, HcalUnpackerReport& report) {
00029
00030 if (raw.size()<16) {
00031 edm::LogWarning("Invalid Data") << "Empty/invalid DCC data, size = " << raw.size();
00032 return;
00033 }
00034
00035
00036 const CastorCTDCHeader* ctdcHeader=(const CastorCTDCHeader*)(raw.data());
00037 int ctdcid=ctdcHeader->getSourceId()-sourceIdOffset_;
00038
00039
00040 std::vector<unsigned short> precdata(CastorCORData::CHANNELS_PER_SPIGOT*CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL);
00041 std::vector<unsigned short> trigdata(CastorCORData::CHANNELS_PER_SPIGOT*CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL);
00042 std::vector<unsigned char> preclen(CastorCORData::CHANNELS_PER_SPIGOT);
00043 std::vector<unsigned char> triglen(CastorCORData::CHANNELS_PER_SPIGOT);
00044
00045
00046 CastorCORData cor;
00047 for (int spigot=0; spigot<CastorCTDCHeader::SPIGOT_COUNT; spigot++) {
00048 if (!ctdcHeader->getSpigotPresent(spigot)) continue;
00049
00050 int retval=ctdcHeader->getSpigotData(spigot,cor,raw.size());
00051 if (retval!=0) {
00052 if (retval==-1) {
00053 edm::LogWarning("Invalid Data") << "Invalid COR data (data beyond payload size) observed on spigot " << spigot << " of CTDC with source id " << ctdcHeader->getSourceId();
00054 report.countSpigotFormatError();
00055 }
00056 continue;
00057 }
00058
00059 if (!cor.check()) {
00060 edm::LogWarning("Invalid Data") << "Invalid COR data observed on spigot " << spigot << " of CTDC with source id " << ctdcHeader->getSourceId();
00061 report.countSpigotFormatError();
00062 continue;
00063 }
00064 if (cor.isHistogramEvent()) {
00065 edm::LogWarning("Invalid Data") << "Histogram data passed to non-histogram unpacker on spigot " << spigot << " of CTDC with source id " << ctdcHeader->getSourceId();
00066 continue;
00067
00068 }
00069
00070 int nps=cor.getNPS()-startSample_;
00071
00072
00073
00074 cor.unpack(&(preclen[0]),&(precdata[0]),
00075 &(triglen[0]),&(trigdata[0]));
00076
00077
00079 int ichan;
00080 for ( ichan = 0; ichan<CastorCORData::CHANNELS_PER_SPIGOT; ichan++) {
00081 if ( preclen[ichan] == 0 || preclen[ichan] & 0xc0 ) continue;
00082 int fiber = ichan/3;
00083 int fiberchan = ichan%3;
00084
00085 CastorElectronicsId partialEid(fiberchan,fiber+1,spigot,ctdcid);
00086
00087 CastorElectronicsId eid;
00088 HcalGenericDetId did;
00089 bool found;
00090 found = emap.lookup(partialEid,eid,did);
00091
00092 if (found) {
00093 CastorDataFrame digi = CastorDataFrame(HcalCastorDetId(did));
00094
00095 digi.setPresamples(nps);
00096
00097 int ntaken = 0;
00098 for ( int sample = startSample_; sample <= endSample_; sample++ ) {
00099 digi.setSample(ntaken,precdata[ichan*CastorCORData::MAXIMUM_SAMPLES_PER_CHANNEL+sample]);
00100 ntaken++;
00101 }
00102 digi.setSize(ntaken);
00103 colls.castorCont->push_back(digi);
00104 } else {
00105 report.countUnmappedDigi();
00106 if (unknownIds_.find(partialEid)==unknownIds_.end()) {
00107 edm::LogWarning("CASTOR") << "CastorCtdcUnpacker: No match found for electronics partialEid :" << partialEid;
00108 unknownIds_.insert(partialEid);
00109 }
00110 }
00111 }
00112
00113 }
00114 }
00115
00116