Go to the documentation of this file.00001 #include "EventFilter/SiStripRawToDigi/plugins/ExcludedFEDListProducer.h"
00002 #include "DataFormats/Common/interface/DetSet.h"
00003 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00004 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00005 #include "DataFormats/FEDRawData/src/fed_header.h"
00006 #include "DataFormats/FEDRawData/src/fed_trailer.h"
00007 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00008 #include "DataFormats/SiStripCommon/interface/SiStripEventSummary.h"
00009 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00010 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00011 #include "EventFilter/SiStripRawToDigi/interface/TFHeaderDescription.h"
00012 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00013 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
00014 #include "FWCore/Utilities/interface/Exception.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include <iostream>
00017 #include <sstream>
00018 #include <iomanip>
00019 #include <ext/algorithm>
00020
00021 namespace sistrip {
00022
00023 ExcludedFEDListProducer::ExcludedFEDListProducer( const edm::ParameterSet& pset ) :
00024 runNumber_(0),
00025 productLabel_(pset.getParameter<edm::InputTag>("ProductLabel")),
00026 cabling_(0),
00027 cacheId_(0)
00028 {
00029 produces<DetIdCollection>();
00030 }
00031
00032 ExcludedFEDListProducer::~ExcludedFEDListProducer()
00033 {
00034 }
00035
00036
00037 void ExcludedFEDListProducer::beginRun( const edm::Run & run, const edm::EventSetup & es)
00038 {
00039 uint32_t cacheId = es.get<SiStripFedCablingRcd>().cacheIdentifier();
00040
00041 if ( cacheId_ != cacheId ) {
00042
00043 edm::ESHandle<SiStripFedCabling> c;
00044 es.get<SiStripFedCablingRcd>().get( c );
00045 cabling_ = c.product();
00046 }
00047 }
00048
00049 void ExcludedFEDListProducer::produce( edm::Event& event, const edm::EventSetup& es)
00050 {
00051 if( runNumber_ != event.run() ) {
00052
00053 runNumber_ = event.run();
00054
00055 DetIdCollection emptyDetIdCollection;
00056 detids_.swap(emptyDetIdCollection);
00057
00058 detids_.reserve(100);
00059
00060 edm::Handle<FEDRawDataCollection> buffers;
00061 event.getByLabel( productLabel_, buffers );
00062
00063
00064 std::vector<uint16_t>::const_iterator ifed = cabling_->feds().begin();
00065 for ( ; ifed != cabling_->feds().end(); ifed++ ) {
00066
00067
00068
00069
00070
00071 const FEDRawData& input = buffers->FEDData( static_cast<int>(*ifed) );
00072
00073
00074 if( input.size() == 0 ) {
00075
00076
00077 const std::vector<FedChannelConnection>& conns = cabling_->connections(*ifed);
00078
00079 detids_.reserve(detids_.size()+conns.size());
00080 std::vector<FedChannelConnection>::const_iterator iconn = conns.begin();
00081 for ( ; iconn != conns.end(); ++iconn ) {
00082 if ( !iconn->detId() || iconn->detId() == sistrip::invalid32_ ) continue;
00083 detids_.push_back(iconn->detId());
00084 }
00085 }
00086 }
00087 }
00088
00089 std::auto_ptr< DetIdCollection > detids( new DetIdCollection(detids_) );
00090
00091
00092
00093
00094
00095 event.put(detids);
00096 }
00097 }