Go to the documentation of this file.00001 #include "EventFilter/SiStripRawToDigi/interface/SiStripRawToClustersLazyUnpacker.h"
00002 #include <sstream>
00003 #include <iostream>
00004
00005
00006 namespace sistrip {
00007
00008 RawToClustersLazyUnpacker::RawToClustersLazyUnpacker(const SiStripRegionCabling& regioncabling, StripClusterizerAlgorithm& clustalgo, SiStripRawProcessingAlgorithms& rpAlgos, const FEDRawDataCollection& data, bool dump) :
00009
00010 raw_(&data),
00011 regions_(&(regioncabling.getRegionCabling())),
00012 clusterizer_(&clustalgo),
00013 rawAlgos_(&rpAlgos),
00014 buffers_(),
00015 rawToDigi_(0,0,0,0,0,0,0,0),
00016 dump_(dump),
00017 doAPVEmulatorCheck_(true)
00018 {
00019 buffers_.assign(1024,static_cast<sistrip::FEDBuffer*>(0));
00020 }
00021
00022 RawToClustersLazyUnpacker::~RawToClustersLazyUnpacker() {
00023
00024 std::vector< sistrip::FEDBuffer*>::iterator ibuffer = buffers_.begin();
00025 for (; ibuffer!=buffers_.end(); ibuffer++) {
00026 if (*ibuffer) delete *ibuffer;
00027 }
00028 }
00029
00030 void RawToClustersLazyUnpacker::fill(const uint32_t& index, record_type& record) {
00031
00032
00033 uint32_t region = SiStripRegionCabling::region(index);
00034 uint32_t subdet = static_cast<uint32_t>(SiStripRegionCabling::subdet(index));
00035 uint32_t layer = SiStripRegionCabling::layer(index);
00036
00037
00038 const SiStripRegionCabling::ElementCabling& element = (*regions_)[region][subdet][layer];
00039
00040
00041 SiStripRegionCabling::ElementCabling::const_iterator idet = element.begin();
00042 for (;idet!=element.end();idet++) {
00043
00044
00045 if ( !(idet->first) || (idet->first == sistrip::invalid32_) || !clusterizer_->stripByStripBegin(idet->first)) { continue; }
00046
00047
00048 std::vector<FedChannelConnection>::const_iterator iconn = idet->second.begin();
00049 for (;iconn!=idet->second.end();iconn++) {
00050 const uint16_t fedId = iconn->fedId();
00051
00052
00053 if ( !fedId || !iconn->isConnected() ) { continue; }
00054
00055
00056 FEDBuffer* buffer = buffers_[fedId];
00057 if (!buffer) {
00058
00059
00060 const FEDRawData& rawData = raw_->FEDData( static_cast<int>(fedId) );
00061
00062
00063 if ( !rawData.data() ) {
00064 if (edm::isDebugEnabled()) {
00065 edm::LogWarning(sistrip::mlRawToCluster_)
00066 << "[sistrip::RawToClustersLazyGetter::"
00067 << __func__
00068 << "]"
00069 << " NULL pointer to FEDRawData for FED id "
00070 << fedId;
00071 }
00072 continue;
00073 }
00074
00075
00076 if ( !rawData.size() ) {
00077 if (edm::isDebugEnabled()) {
00078 edm::LogWarning(sistrip::mlRawToCluster_)
00079 << "[sistrip::RawToClustersLazyGetter::"
00080 << __func__ << "]"
00081 << " FEDRawData has zero size for FED id "
00082 << fedId;
00083 }
00084 continue;
00085 }
00086
00087
00088 try {
00089 buffers_[fedId] = buffer = new sistrip::FEDBuffer(rawData.data(),rawData.size());
00090 if (!buffer->doChecks()) throw cms::Exception("FEDBuffer") << "FED Buffer check fails for FED ID" << fedId << ".";
00091 }
00092 catch (const cms::Exception& e) {
00093 if (edm::isDebugEnabled()) {
00094 edm::LogWarning(sistrip::mlRawToCluster_)
00095 << "Exception caught when creating FEDBuffer object for FED " << fedId << ": " << e.what();
00096 }
00097 if ( buffer ) { delete buffer; }
00098 buffers_[fedId] = 0;
00099 continue;
00100 }
00101
00102
00103 if ( dump_ ) {
00104 std::stringstream ss;
00105 rawToDigi_.dumpRawData( fedId, rawData, ss );
00106 LogTrace(mlRawToDigi_)
00107 << ss.str();
00108 }
00109 }
00110
00111
00112 const uint8_t fedCh = iconn->fedCh();
00113
00114 if (!buffer->channelGood(fedCh,doAPVEmulatorCheck_)) {
00115 if (edm::isDebugEnabled()) {
00116 std::ostringstream ss;
00117 ss << "Problem unpacking channel " << fedCh << " on FED " << fedId;
00118 edm::LogWarning(sistrip::mlRawToCluster_) << ss.str();
00119 }
00120 continue;
00121 }
00122
00123
00124 uint16_t ipair = iconn->apvPairNumber();
00125
00126 const sistrip::FEDReadoutMode mode = buffer->readoutMode();
00127 if (mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED ) {
00128
00129 try {
00130
00131 sistrip::FEDZSChannelUnpacker unpacker = sistrip::FEDZSChannelUnpacker::zeroSuppressedModeUnpacker(buffer->channel(fedCh));
00132
00133
00134 while (unpacker.hasData()) {
00135 clusterizer_->stripByStripAdd(unpacker.sampleNumber()+ipair*256,unpacker.adc(),record);
00136 unpacker++;
00137 }
00138 } catch (const cms::Exception& e) {
00139 if (edm::isDebugEnabled()) {
00140 std::ostringstream ss;
00141 ss << "Unordered clusters for channel " << fedCh << " on FED " << fedId << ": " << e.what();
00142 edm::LogWarning(sistrip::mlRawToCluster_) << ss.str();
00143 }
00144 continue;
00145 }
00146 }
00147
00148 else if (mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE ) {
00149
00150 try {
00151
00152 sistrip::FEDZSChannelUnpacker unpacker = sistrip::FEDZSChannelUnpacker::zeroSuppressedLiteModeUnpacker(buffer->channel(fedCh));
00153
00154
00155 while (unpacker.hasData()) {
00156 clusterizer_->stripByStripAdd(unpacker.sampleNumber()+ipair*256,unpacker.adc(),record);
00157 unpacker++;
00158 }
00159 } catch (const cms::Exception& e) {
00160 if (edm::isDebugEnabled()) {
00161 std::ostringstream ss;
00162 ss << "Unordered clusters for channel " << fedCh << " on FED " << fedId << ": " << e.what();
00163 edm::LogWarning(sistrip::mlRawToCluster_) << ss.str();
00164 }
00165 continue;
00166 }
00167 }
00168
00169 else if (mode == sistrip::READOUT_MODE_VIRGIN_RAW ) {
00170
00171
00172 sistrip::FEDRawChannelUnpacker unpacker = sistrip::FEDRawChannelUnpacker::virginRawModeUnpacker(buffer->channel(fedCh));
00173
00174
00175 std::vector<int16_t> digis;
00176 while (unpacker.hasData()) {
00177 digis.push_back(unpacker.adc());
00178 unpacker++;
00179 }
00180
00181
00182 uint32_t id = iconn->detId();
00183 edm::DetSet<SiStripDigi> zsdigis(id);
00184
00185
00186
00187 uint16_t firstAPV = ipair*2;
00188 rawAlgos_->SuppressVirginRawData(id, firstAPV,digis, zsdigis);
00189 for( edm::DetSet<SiStripDigi>::const_iterator it = zsdigis.begin(); it!=zsdigis.end(); it++) {
00190 clusterizer_->stripByStripAdd( it->strip(), it->adc(), record);
00191 }
00192 }
00193
00194 else if (mode == sistrip::READOUT_MODE_PROC_RAW ) {
00195
00196
00197 sistrip::FEDRawChannelUnpacker unpacker = sistrip::FEDRawChannelUnpacker::procRawModeUnpacker(buffer->channel(fedCh));
00198
00199
00200 std::vector<int16_t> digis;
00201 while (unpacker.hasData()) {
00202 digis.push_back(unpacker.adc());
00203 unpacker++;
00204 }
00205
00206
00207 uint32_t id = iconn->detId();
00208 edm::DetSet<SiStripDigi> zsdigis(id);
00209
00210
00211 uint16_t firstAPV = ipair*2;
00212 rawAlgos_->SuppressProcessedRawData(id, firstAPV,digis, zsdigis);
00213 for( edm::DetSet<SiStripDigi>::const_iterator it = zsdigis.begin(); it!=zsdigis.end(); it++) {
00214 clusterizer_->stripByStripAdd( it->strip(), it->adc(), record);
00215 }
00216 }
00217
00218 else {
00219 edm::LogWarning(sistrip::mlRawToCluster_)
00220 << "[sistrip::RawToClustersLazyGetter::"
00221 << __func__ << "]"
00222 << " FEDRawData readout mode "
00223 << mode
00224 << " from FED id "
00225 << fedId
00226 << " not supported.";
00227 continue;
00228 }
00229 }
00230 clusterizer_->stripByStripEnd(record);
00231 }
00232 }
00233
00234
00235 }