40 #define COUT std::cout << "VI " 42 #define COUT LogDebug("") 48 std::unique_ptr<sistrip::FEDBuffer>
buffer;
57 <<
"[ClustersFromRawProducer::" 60 <<
" NULL pointer to FEDRawData for FED id " 70 <<
"[ClustersFromRawProducer::" 72 <<
" FEDRawData has zero size for FED id " 81 if UNLIKELY(!buffer->doChecks(
false))
throw cms::Exception(
"FEDBuffer") <<
"FED Buffer check fails for FED ID" << fedId <<
".";
86 <<
"Exception caught when creating FEDBuffer object for FED " << fedId <<
": " << e.
what();
88 return std::unique_ptr<sistrip::FEDBuffer>();
111 bool idoAPVEmulatorCheck,
112 bool hybridZeroSuppressed):
116 doAPVEmulatorCheck(idoAPVEmulatorCheck),
117 hybridZeroSuppressed_(hybridZeroSuppressed){
119 for (
auto &
d : done)
d=
nullptr;
123 ~ClusterFiller()
override { printStat();}
130 std::unique_ptr<sistrip::FEDBuffer> buffers[1024];
131 std::atomic<sistrip::FEDBuffer*> done[1024];
141 bool doAPVEmulatorCheck;
143 bool hybridZeroSuppressed_;
148 Stat() : totDet(0), detReady(0),detSet(0),detAct(0),detNoZ(0),detAbrt(0),totClus(0){}
149 std::atomic<int> totDet;
150 std::atomic<int> detReady;
151 std::atomic<int> detSet;
152 std::atomic<int> detAct;
153 std::atomic<int> detNoZ;
154 std::atomic<int> detAbrt;
155 std::atomic<int> totClus;
160 void incTot(
int n)
const { stat.totDet=
n;}
161 void incReady()
const { stat.detReady++;}
162 void incSet()
const { stat.detSet++;}
163 void incAct()
const { stat.detAct++;}
164 void incNoZ()
const { stat.detNoZ++;}
165 void incAbrt()
const { stat.detAbrt++;}
166 void incClus(
int n)
const { stat.totClus+=
n;}
167 void printStat()
const {
168 COUT <<
"VI clusters " << stat.totDet <<
','<< stat.detReady <<
','<< stat.detSet <<
','<< stat.detAct<<
','<< stat.detNoZ <<
','<<stat.detAbrt <<
','<<stat.totClus << std::endl;
172 static void zeroStat(){}
173 static void incTot(
int){}
174 static void incReady() {}
175 static void incSet() {}
176 static void incAct() {}
177 static void incNoZ() {}
178 static void incAbrt(){}
179 static void incClus(
int){}
180 static void printStat(){}
199 doAPVEmulatorCheck_(conf.existsAs<
bool>(
"DoAPVEmulatorCheck") ? conf.getParameter<
bool>(
"DoAPVEmulatorCheck") :
true),
200 hybridZeroSuppressed_(conf.getParameter<
bool>(
"HybridZeroSuppressed"))
203 produces< edmNew::DetSetVector<SiStripCluster> > ();
204 assert(clusterizer_.get());
205 assert(rawAlgos_.get());
223 std::unique_ptr< edmNew::DetSetVector<SiStripCluster> >
output(
227 std::make_shared<ClusterFiller>(*rawData, *clusterizer_, *rawAlgos_,
228 doAPVEmulatorCheck_, hybridZeroSuppressed_)),
229 clusterizer_->allDetIds())
235 output->reserve(15000,24*10000);
241 COUT <<
output->dataSize() <<
" clusters from " 242 <<
output->size() <<
" modules" 266 std::unique_ptr<SiStripRawProcessingAlgorithms>
rawAlgos_;
283 (*clusterizer_).initialize(es);
284 cabling_ = (*clusterizer_).cabling();
285 (*rawAlgos_).initialize(es);
292 ClusterFiller
filler(rawColl, *clusterizer_, *rawAlgos_, doAPVEmulatorCheck_, hybridZeroSuppressed_);
295 for (
auto idet : clusterizer_->allDetIds()) {
301 if(record.empty()) record.abort();
307 template<
typename OUT>
314 {
auto unpacker = FEDZSChannelUnpacker::zeroSuppressedLiteModeUnpacker(chan);
315 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()); unpacker++; }
319 {
auto unpacker = FEDBSChannelUnpacker::zeroSuppressedLiteModeUnpacker(chan, 10);
320 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()); unpacker++; }
327 {
auto unpacker = FEDZSChannelUnpacker::zeroSuppressedModeUnpacker(chan);
328 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()); unpacker++; }
331 {
auto unpacker = FEDBSChannelUnpacker::zeroSuppressedModeUnpacker(chan, 10);
332 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()); unpacker++; }
335 {
auto unpacker = FEDBSChannelUnpacker::zeroSuppressedModeUnpacker(chan, 8);
336 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()<<2); unpacker++; }
339 {
auto unpacker = FEDBSChannelUnpacker::zeroSuppressedModeUnpacker(chan, 8);
340 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()<<1); unpacker++; }
344 <<
" invalid packet code " << chan.
packetCode() <<
" for zero-suppressed.";
349 {
auto unpacker = FEDZSChannelUnpacker::zeroSuppressedLiteModeUnpacker(chan);
350 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()<<1); unpacker++; }
354 {
auto unpacker = FEDZSChannelUnpacker::zeroSuppressedLiteModeUnpacker(chan);
355 while (unpacker.hasData()) { *out++ =
SiStripDigi(stripOffset+unpacker.sampleNumber(), unpacker.adc()<<2); unpacker++; }
362 class StripByStripAdder {
364 typedef std::output_iterator_tag iterator_category;
366 typedef void difference_type;
367 typedef void pointer;
373 : clusterizer_(clusterizer), state_(state), record_(record) {}
377 clusterizer_.stripByStripAdd(state_, digi.
strip(), digi.
adc(), record_);
381 StripByStripAdder&
operator* () {
return *
this; }
382 StripByStripAdder& operator++ () {
return *
this; }
383 StripByStripAdder& operator++ (
int) {
return *
this; }
395 auto idet= record.id();
397 COUT <<
"filling " << idet << std::endl;
399 auto const & det =
clusterizer.stripByStripBegin(idet);
400 if (!det.valid())
return;
406 for (
auto const conn :
clusterizer.currentConnection(det)) {
409 const uint16_t
fedId = conn->fedId();
412 if UNLIKELY( !fedId || !conn->isConnected() ) {
continue; }
418 buffer = fillBuffer(fedId, rawColl).release();
419 if (!buffer) {
continue;}
421 if (done[fedId].compare_exchange_strong(exp, buffer)) buffers[
fedId].reset(buffer);
427 const uint8_t fedCh = conn->fedCh();
431 std::ostringstream ss;
432 ss <<
"Problem unpacking channel " << fedCh <<
" on FED " <<
fedId;
439 uint16_t ipair = conn->apvPairNumber();
447 auto perStripAdder = StripByStripAdder(
clusterizer, state, record);
448 if LIKELY( ! hybridZeroSuppressed_ ) {
449 unpackZS(buffer->
channel(fedCh),
mode, ipair*256, perStripAdder);
451 const uint32_t
id = conn->detId();
453 unpackZS(buffer->
channel(fedCh),
mode, ipair*256, std::back_inserter(unpDigis));
455 rawAlgos.convertHybridDigiToRawDigiVector(unpDigis, workRawDigis);
457 rawAlgos.suppressHybridData(
id, ipair*2, workRawDigis, suppDigis);
471 std::vector<int16_t> digis;
475 while (unpacker.hasData()) { digis.push_back(unpacker.adc()); unpacker++; }
479 while (unpacker.hasData()) { digis.push_back(unpacker.adc()); unpacker++; }
483 while (unpacker.hasData()) { digis.push_back(unpacker.adc()<<2); unpacker++; }
487 while (unpacker.hasData()) { digis.push_back(unpacker.adc()<<1); unpacker++; }
491 <<
" invalid packet code " << buffer->
channel(fedCh).
packetCode() <<
" for virgin raw.";
494 uint32_t
id = conn->detId();
499 uint16_t firstAPV = ipair*2;
500 rawAlgos.suppressVirginRawData(
id, firstAPV,digis, zsdigis);
501 for (
const auto digi : zsdigis ) {
511 std::vector<int16_t> digis;
513 digis.push_back(unpacker.
adc());
518 uint32_t
id = conn->detId();
522 uint16_t firstAPV = ipair*2;
523 rawAlgos.suppressProcessedRawData(
id, firstAPV,digis, zsdigis);
529 <<
"[ClustersFromRawProducer::" << __func__ <<
"]" 530 <<
" FEDRawData readout mode " << mode <<
" from FED id " << fedId <<
" not supported.";
545 if(!record.empty()) incNoZ();
547 COUT <<
"filled " << record.size() << std::endl;
548 for (
auto const &
cl : record )
COUT <<
cl.firstStrip() <<
','<<
cl.amplitudes().size() << std::endl;
549 incClus(record.size());
static FEDRawChannelUnpacker procRawModeUnpacker(const FEDChannel &channel)
T getParameter(std::string const &) const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_BOTBOT
static AlgebraicMatrix initialize()
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
void beginRun(const edm::Run &, const edm::EventSetup &es) override
void run(const FEDRawDataCollection &rawColl, edmNew::DetSetVector< SiStripCluster > &output)
static const char mlRawToCluster_[]
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
SiStripAPVRestorer::digivector_t digivector_t
static FEDRawChannelUnpacker virginRawModeUnpacker(const FEDChannel &channel)
FEDReadoutMode readoutMode() const
char const * what() const override
void initialize(const edm::EventSetup &es)
static FEDBSChannelUnpacker virginRawModeUnpacker(const FEDChannel &channel, uint16_t num_bits)
friend class TSFastFiller
virtual bool channelGood(const uint8_t internalFEDannelNum, const bool doAPVeCheck=true) const
size_t size() const
Lenght of the data buffer in bytes.
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED8_TOPBOT
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED10
static const uint8_t PACKET_CODE_VIRGIN_RAW10
void produce(edm::Event &ev, const edm::EventSetup &es) override
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED
Container::value_type value_type
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
static std::auto_ptr< StripClusterizerAlgorithm > create(const edm::ParameterSet &)
const uint16_t & strip() const
std::unique_ptr< StripClusterizerAlgorithm > clusterizer_
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
const FEDChannel & channel(const uint8_t internalFEDChannelNum) const
static const uint8_t PACKET_CODE_VIRGIN_RAW8_TOPBOT
static const uint8_t PACKET_CODE_VIRGIN_RAW8_BOTBOT
SiStripDetCabling const * cabling_
chan
lumi = TPaveText(lowX+0.38, lowY+0.061, lowX+0.45, lowY+0.161, "NDC") lumi.SetBorderSize( 0 ) lumi...
uint8_t packetCode() const
SiStripClusterizerFromRaw(const edm::ParameterSet &conf)
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
MatrixMeschach operator*(const MatrixMeschach &mat1, const MatrixMeschach &mat2)
collection_type::const_iterator const_iterator
const uint16_t & adc() const
bool hybridZeroSuppressed_
std::unique_ptr< SiStripRawProcessingAlgorithms > rawAlgos_
edm::EDGetTokenT< FEDRawDataCollection > productToken_
static const uint8_t PACKET_CODE_VIRGIN_RAW