Go to the documentation of this file.00001 #include <string>
00002 #include <memory>
00003 #include <vector>
00004 #include <utility>
00005 #include "boost/cstdint.hpp"
00006
00007 #include "FWCore/Framework/interface/EDProducer.h"
00008 #include "FWCore/Framework/interface/Event.h"
00009 #include "FWCore/Framework/interface/EventSetup.h"
00010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00011 #include "FWCore/Utilities/interface/InputTag.h"
00012 #include "FWCore/Framework/interface/ESHandle.h"
00013 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00014
00015 #include "DataFormats/Common/interface/Handle.h"
00016 #include "DataFormats/Common/interface/DetSetVector.h"
00017 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00018 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00019
00020 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyDigiConverter.h"
00021 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
00022
00023 class SiStripFedCabling;
00024
00034 namespace sistrip {
00035
00036 class SpyDigiConverterModule : public edm::EDProducer
00037 {
00038 public:
00039 SpyDigiConverterModule( const edm::ParameterSet& );
00040 ~SpyDigiConverterModule();
00041 virtual void beginRun( edm::Run&, const edm::EventSetup& );
00042 virtual void produce( edm::Event&, const edm::EventSetup& );
00043
00044 private:
00045 const edm::InputTag productLabel_;
00046 const bool storeAPVAddress_;
00047 const bool storePayloadDigis_, storeReorderedDigis_, storeModuleDigis_;
00048 sistrip::SpyUtilities::FrameQuality frameQuality_;
00049 const bool discardDigisWithAPVAddressError_;
00050 const uint32_t expectedHeaderBit_;
00051
00052
00053 SpyUtilities utility_;
00054 };
00055
00056 }
00057
00058
00059
00060 namespace sistrip {
00061
00062 SpyDigiConverterModule::SpyDigiConverterModule( const edm::ParameterSet& pset ) :
00063 productLabel_(pset.getParameter<edm::InputTag>("InputProductLabel")),
00064 storeAPVAddress_(pset.getParameter<bool>("StoreAPVAddress")),
00065 storePayloadDigis_(pset.getParameter<bool>("StorePayloadDigis")),
00066 storeReorderedDigis_(pset.getParameter<bool>("StoreReorderedDigis")),
00067 storeModuleDigis_(pset.getParameter<bool>("StoreModuleDigis")),
00068 discardDigisWithAPVAddressError_(pset.getParameter<bool>("DiscardDigisWithWrongAPVAddress")),
00069 expectedHeaderBit_(pset.getParameter<uint32_t>("ExpectedPositionOfFirstHeaderBit"))
00070 {
00071 if ( edm::isDebugEnabled() ) {
00072 LogTrace("SiStripSpyDigiConverter")
00073 << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
00074 << " Constructing object...";
00075 }
00076
00077 if (storePayloadDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Payload");
00078 if (storeReorderedDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("Reordered");
00079 if (storeModuleDigis_) produces< edm::DetSetVector<SiStripRawDigi> >("VirginRaw");
00080
00081 if (storeAPVAddress_) {
00082 produces< std::vector<uint32_t> >("APVAddress");
00083
00084 }
00085
00086
00087 frameQuality_.minDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinDigiRange"));
00088 frameQuality_.maxDigiRange = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxDigiRange"));
00089 frameQuality_.minZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinZeroLight"));
00090 frameQuality_.maxZeroLight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxZeroLight"));
00091 frameQuality_.minTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MinTickHeight"));
00092 frameQuality_.maxTickHeight = static_cast<uint16_t>(pset.getParameter<uint32_t>("MaxTickHeight"));
00093
00094
00095 }
00096
00097
00098 SpyDigiConverterModule::~SpyDigiConverterModule() {
00099 if ( edm::isDebugEnabled() ) {
00100 LogTrace("SiStripSpyDigiConverter")
00101 << "[sistrip::SpyDigiConverterModule::" << __func__ << "]"
00102 << " Destructing object...";
00103 }
00104 }
00105
00106
00107 void SpyDigiConverterModule::beginRun( edm::Run& run, const edm::EventSetup& setup ) {
00108
00109 }
00110
00117 void SpyDigiConverterModule::produce( edm::Event& event, const edm::EventSetup& setup ) {
00118
00119 static bool lFirstEvent = true;
00120
00121 const SiStripFedCabling* lCabling = utility_.getCabling( setup );
00122
00123 if ( !(storePayloadDigis_ || storeReorderedDigis_ || storeModuleDigis_ || storeAPVAddress_) ) return;
00124
00125
00126 edm::Handle<sistrip::SpyDigiConverter::DSVRawDigis> scopeDigisHandle;
00127 event.getByLabel(productLabel_, scopeDigisHandle);
00128
00129
00130 std::auto_ptr< std::vector<uint32_t> > pAPVAddresses(new std::vector<uint32_t>);
00131
00132 std::auto_ptr<sistrip::SpyDigiConverter::DSVRawDigis> payloadDigis, reorderedDigis, moduleDigis;
00133
00134
00135
00136 if (lFirstEvent){
00137 uint16_t lFirstHeaderBit;
00138 sistrip::SpyUtilities::getMajorityHeader(scopeDigisHandle.product(),lFirstHeaderBit);
00139
00140 if (lFirstHeaderBit != static_cast<uint16_t>(expectedHeaderBit_)) {
00141 edm::LogWarning("") << " -- Majority position for firstHeaderBit in first event ("
00142 << lFirstHeaderBit
00143 << ") is not where expected: "
00144 << static_cast<uint16_t>(expectedHeaderBit_)
00145 << std::endl;
00146 }
00147
00148 }
00149
00150
00151
00152
00153 payloadDigis = sistrip::SpyDigiConverter::extractPayloadDigis(scopeDigisHandle.product(),
00154 pAPVAddresses.get(),
00155 discardDigisWithAPVAddressError_,
00156 frameQuality_,
00157 static_cast<uint16_t>(expectedHeaderBit_));
00158
00159
00160 if (storeReorderedDigis_ || storeModuleDigis_) {
00161 reorderedDigis = sistrip::SpyDigiConverter::reorderDigis(payloadDigis.get());
00162 }
00163
00164
00165 if (storeModuleDigis_) {
00166 moduleDigis = sistrip::SpyDigiConverter::mergeModuleChannels(reorderedDigis.get(), *lCabling);
00167 }
00168
00169
00170 if (storePayloadDigis_) event.put(payloadDigis,"Payload");
00171 if (storeReorderedDigis_) event.put(reorderedDigis,"Reordered");
00172 if (storeModuleDigis_) event.put(moduleDigis,"VirginRaw");
00173 if (storeAPVAddress_) {
00174 event.put(pAPVAddresses, "APVAddress");
00175 }
00176
00177
00178 lFirstEvent = false;
00179
00180 }
00181
00182 }
00183
00184
00185 #include "FWCore/Framework/interface/MakerMacros.h"
00186 typedef sistrip::SpyDigiConverterModule SiStripSpyDigiConverterModule;
00187 DEFINE_FWK_MODULE(SiStripSpyDigiConverterModule);