Go to the documentation of this file.00001
00002 #include "EventFilter/SiStripRawToDigi/plugins/SiStripRawToDigiModule.h"
00003 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00004 #include "CondFormats/DataRecord/interface/SiStripFedCablingRcd.h"
00005 #include "DataFormats/Common/interface/DetSetVector.h"
00006 #include "DataFormats/Common/interface/Handle.h"
00007 #include "DataFormats/DetId/interface/DetIdCollection.h"
00008 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00009 #include "DataFormats/SiStripCommon/interface/SiStripConstants.h"
00010 #include "DataFormats/SiStripCommon/interface/SiStripEventSummary.h"
00011 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00012 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00013 #include "EventFilter/SiStripRawToDigi/interface/SiStripRawToDigiUnpacker.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00016 #include <cstdlib>
00017
00018 namespace sistrip {
00019
00020 RawToDigiModule::RawToDigiModule( const edm::ParameterSet& pset ) :
00021 rawToDigi_(0),
00022 productLabel_(pset.getParameter<edm::InputTag>("ProductLabel")),
00023 cabling_(0),
00024 cacheId_(0),
00025 extractCm_(false),
00026 doFullCorruptBufferChecks_(false)
00027 {
00028 if ( edm::isDebugEnabled() ) {
00029 LogTrace("SiStripRawToDigi")
00030 << "[sistrip::RawToDigiModule::" << __func__ << "]"
00031 << " Constructing object...";
00032 }
00033
00034 int16_t appended_bytes = pset.getParameter<int>("AppendedBytes");
00035 int16_t trigger_fed_id = pset.getParameter<int>("TriggerFedId");
00036 bool use_daq_register = pset.getParameter<bool>("UseDaqRegister");
00037 bool using_fed_key = pset.getParameter<bool>("UseFedKey");
00038 bool unpack_bad_channels = pset.getParameter<bool>("UnpackBadChannels");
00039 bool mark_missing_feds = pset.getParameter<bool>("MarkModulesOnMissingFeds");
00040
00041 int16_t fed_buffer_dump_freq = pset.getUntrackedParameter<int>("FedBufferDumpFreq",0);
00042 int16_t fed_event_dump_freq = pset.getUntrackedParameter<int>("FedEventDumpFreq",0);
00043 bool quiet = pset.getUntrackedParameter<bool>("Quiet",true);
00044 extractCm_ = pset.getParameter<bool>("UnpackCommonModeValues");
00045 doFullCorruptBufferChecks_ = pset.getParameter<bool>("DoAllCorruptBufferChecks");
00046 uint32_t errorThreshold = pset.getParameter<unsigned int>("ErrorThreshold");
00047
00048 rawToDigi_ = new sistrip::RawToDigiUnpacker( appended_bytes, fed_buffer_dump_freq, fed_event_dump_freq, trigger_fed_id, using_fed_key, unpack_bad_channels, mark_missing_feds, errorThreshold);
00049 rawToDigi_->quiet(quiet);
00050 rawToDigi_->useDaqRegister( use_daq_register );
00051 rawToDigi_->extractCm(extractCm_);
00052 rawToDigi_->doFullCorruptBufferChecks(doFullCorruptBufferChecks_);
00053
00054 produces< SiStripEventSummary >();
00055 produces< edm::DetSetVector<SiStripRawDigi> >("ScopeMode");
00056 produces< edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
00057 produces< edm::DetSetVector<SiStripRawDigi> >("ProcessedRaw");
00058 produces< edm::DetSetVector<SiStripDigi> >("ZeroSuppressed");
00059 produces<DetIdCollection>();
00060 if ( extractCm_ ) produces< edm::DetSetVector<SiStripRawDigi> >("CommonMode");
00061
00062 }
00063
00064 RawToDigiModule::~RawToDigiModule() {
00065 if ( rawToDigi_ ) { delete rawToDigi_; }
00066 if ( cabling_ ) { cabling_ = 0; }
00067 if ( edm::isDebugEnabled() ) {
00068 LogTrace("SiStripRawToDigi")
00069 << "[sistrip::RawToDigiModule::" << __func__ << "]"
00070 << " Destructing object...";
00071 }
00072 }
00073
00074 void RawToDigiModule::beginRun( edm::Run& run, const edm::EventSetup& setup ) {
00075 updateCabling( setup );
00076 }
00077
00084 void RawToDigiModule::produce( edm::Event& event, const edm::EventSetup& setup ) {
00085
00086 updateCabling( setup );
00087
00088
00089 edm::Handle<FEDRawDataCollection> buffers;
00090 event.getByLabel( productLabel_, buffers );
00091
00092
00093 std::auto_ptr<SiStripEventSummary> summary( new SiStripEventSummary() );
00094 rawToDigi_->triggerFed( *buffers, *summary, event.id().event() );
00095
00096
00097 edm::DetSetVector<SiStripRawDigi>* sm = new edm::DetSetVector<SiStripRawDigi>();
00098 edm::DetSetVector<SiStripRawDigi>* vr = new edm::DetSetVector<SiStripRawDigi>();
00099 edm::DetSetVector<SiStripRawDigi>* pr = new edm::DetSetVector<SiStripRawDigi>();
00100 edm::DetSetVector<SiStripDigi>* zs = new edm::DetSetVector<SiStripDigi>();
00101 DetIdCollection* ids = new DetIdCollection();
00102 edm::DetSetVector<SiStripRawDigi>* cm = new edm::DetSetVector<SiStripRawDigi>();
00103
00104
00105 if ( rawToDigi_ ) { rawToDigi_->createDigis( *cabling_,*buffers,*summary,*sm,*vr,*pr,*zs,*ids,*cm ); }
00106
00107
00108 std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > sm_dsv(sm);
00109 std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > vr_dsv(vr);
00110 std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > pr_dsv(pr);
00111 std::auto_ptr< edm::DetSetVector<SiStripDigi> > zs_dsv(zs);
00112 std::auto_ptr< DetIdCollection > det_ids(ids);
00113 std::auto_ptr< edm::DetSetVector<SiStripRawDigi> > cm_dsv(cm);
00114
00115
00116 event.put( summary );
00117 event.put( sm_dsv, "ScopeMode" );
00118 event.put( vr_dsv, "VirginRaw" );
00119 event.put( pr_dsv, "ProcessedRaw" );
00120 event.put( zs_dsv, "ZeroSuppressed" );
00121 event.put( det_ids );
00122 if ( extractCm_ ) event.put( cm_dsv, "CommonMode" );
00123
00124 }
00125
00126 void RawToDigiModule::updateCabling( const edm::EventSetup& setup ) {
00127
00128 uint32_t cache_id = setup.get<SiStripFedCablingRcd>().cacheIdentifier();
00129
00130 if ( cacheId_ != cache_id ) {
00131
00132 edm::ESHandle<SiStripFedCabling> c;
00133 setup.get<SiStripFedCablingRcd>().get( c );
00134 cabling_ = c.product();
00135
00136 if ( edm::isDebugEnabled() ) {
00137 if ( !cacheId_ ) {
00138 std::stringstream ss;
00139 ss << "[sistrip::RawToDigiModule::" << __func__ << "]"
00140 << " Updating cabling for first time..." << std::endl
00141 << " Terse print out of FED cabling:" << std::endl;
00142 cabling_->terse(ss);
00143 LogTrace("SiStripRawToDigi") << ss.str();
00144 }
00145 }
00146
00147 if ( edm::isDebugEnabled() ) {
00148 std::stringstream sss;
00149 sss << "[sistrip::RawToDigiModule::" << __func__ << "]"
00150 << " Summary of FED cabling:" << std::endl;
00151 cabling_->summary(sss);
00152 LogTrace("SiStripRawToDigi") << sss.str();
00153 }
00154 cacheId_ = cache_id;
00155 }
00156 }
00157
00158 }
00159