Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include <sstream>
00007 #include <memory>
00008 #include <list>
00009 #include <algorithm>
00010 #include <cassert>
00011 #include <vector>
00012
00013 #include "FWCore/Framework/interface/Frameworkfwd.h"
00014 #include "FWCore/Framework/interface/EDProducer.h"
00015 #include "FWCore/Framework/interface/Event.h"
00016 #include "FWCore/Framework/interface/EventSetup.h"
00017 #include "FWCore/Framework/interface/ESHandle.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 #include "FWCore/Utilities/interface/InputTag.h"
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021 #include "FWCore/ServiceRegistry/interface/Service.h"
00022 #include "FWCore/Utilities/interface/Exception.h"
00023
00024 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
00025 #include "DataFormats/FEDRawData/interface/FEDRawData.h"
00026 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
00027 #include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
00028 #include "DataFormats/Common/interface/DetSetVector.h"
00029 #include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
00030 #include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h"
00031 #include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
00032 #include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
00033
00034 #include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
00035 #include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
00036 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00037
00038 #include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
00039
00040
00041 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingFactory.h"
00042 #include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingAlgorithms.h"
00043
00044 #include "DQM/SiStripMonitorHardware/interface/SiStripFEDEmulator.h"
00045 #include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
00046
00047 using edm::LogError;
00048 using edm::LogInfo;
00049 using edm::LogWarning;
00050
00051 namespace sistrip
00052 {
00053
00054
00055
00056
00057
00058 class FEDEmulatorModule : public edm::EDProducer
00059 {
00060 public:
00061
00062 explicit FEDEmulatorModule(const edm::ParameterSet&);
00063 ~FEDEmulatorModule();
00064
00065 private:
00066
00067 virtual void produce(edm::Event&, const edm::EventSetup&) override;
00068
00069
00070
00071 edm::InputTag spyReorderedDigisTag_;
00072 edm::InputTag spyVirginRawDigisTag_;
00073
00074
00075 bool byModule_;
00076
00077 sistrip::FEDEmulator fedEmulator_;
00078
00079 static const char* messageLabel_;
00080
00081 std::auto_ptr<SiStripRawProcessingAlgorithms> algorithms_;
00082
00083
00084 SpyUtilities utility_;
00085
00086 };
00087
00088 }
00089
00090 namespace sistrip {
00091
00092
00093
00094
00095 const char* FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
00096
00097
00098 FEDEmulatorModule::FEDEmulatorModule(const edm::ParameterSet& iConfig):
00099 spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
00100 spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
00101 byModule_(iConfig.getParameter<bool>("ByModule")),
00102 algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms")))
00103 {
00104
00105 fedEmulator_.initialise(byModule_);
00106
00107 if (!byModule_) {
00108
00109 produces<std::map<uint32_t,std::vector<uint32_t> > >("Medians");
00110 produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
00111 produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
00112 produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
00113 produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
00114 }
00115 else {
00116 produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
00117 produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
00118 produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
00119 produces<std::map<uint32_t,std::vector<uint32_t> > >("ModuleMedians");
00120 produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
00121 produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
00122 }
00123
00124 }
00125
00126 FEDEmulatorModule::~FEDEmulatorModule()
00127 {
00128 }
00129
00130
00131 void
00132 FEDEmulatorModule::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00133 {
00134
00135 const SiStripFedCabling* lCabling = utility_.getCabling( iSetup );
00136 edm::ESHandle<SiStripPedestals> lPedsHandle = utility_.getPedestalHandle(iSetup);
00137 edm::ESHandle<SiStripNoises> lNoiseHandle = utility_.getNoiseHandle(iSetup);
00138
00139
00140 algorithms_->initialize(iSetup);
00141
00142
00143 edm::Handle<edm::DetSetVector<SiStripRawDigi> > lDigisHandle;
00144 try {
00145 if (!byModule_) {
00146 iEvent.getByLabel(spyReorderedDigisTag_, lDigisHandle);
00147 }
00148 else {
00149 iEvent.getByLabel(spyVirginRawDigisTag_, lDigisHandle);
00150 }
00151 } catch (const cms::Exception& e) {
00152 std::cout << e.what() ;
00153 return;
00154 }
00155
00156 const edm::DetSetVector<SiStripRawDigi> * lInputDigis = lDigisHandle.product();
00157
00158 unsigned int lNDigis = lInputDigis->size();
00159
00160
00161
00162 std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedsData;
00163 pedsData.reserve(lNDigis);
00164 std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset > noiseData;
00165 noiseData.reserve(lNDigis);
00166 std::vector<edm::DetSetVector<SiStripRawDigi>::detset > pedSubtrData;
00167 pedSubtrData.reserve(lNDigis);
00168 std::vector<edm::DetSetVector<SiStripRawDigi>::detset > cmSubtrData;
00169 cmSubtrData.reserve(lNDigis);
00170
00171 std::vector< edm::DetSet<SiStripDigi> > zsData;
00172
00173
00174 std::map<uint32_t,std::vector<uint32_t> > medsData;
00175
00176 edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
00177
00178 for ( ; inputChannel!=lInputDigis->end(); ++inputChannel){
00179 uint32_t lDetId = inputChannel->detId();
00180
00181 pedsData.push_back( edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00182 noiseData.push_back( edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId) );
00183 pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00184 cmSubtrData.push_back( edm::DetSetVector<SiStripRawDigi>::detset(lDetId) );
00185
00186 unsigned int lNStrips = inputChannel->size();
00187
00188
00189 std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
00190 pedsDetSetData.reserve(lNStrips);
00191 std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
00192 noiseDetSetData.reserve(lNStrips);
00193 std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
00194 pedSubtrDetSetData.reserve(lNStrips);
00195 std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
00196 cmSubtrDetSetData.reserve(lNStrips);
00197
00198 edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
00199
00200
00201 uint32_t lNPairs = static_cast<uint32_t>(lNStrips*1./sistrip::STRIPS_PER_FEDCH);
00202 uint32_t lPair = 0;
00203
00204 std::vector<uint32_t> medsDetSetData;
00205 medsDetSetData.reserve(lNPairs*2);
00206
00207 if (!byModule_) {
00208
00209 uint16_t lFedId = 0;
00210 uint16_t lFedChannel = 0;
00211 sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
00212
00213 const FedChannelConnection & lConnection = lCabling->connection(lFedId,lFedChannel);
00214 lDetId = lConnection.detId();
00215 lNPairs = lConnection.nApvPairs();
00216 lPair = lConnection.apvPairNumber();
00217 }
00218
00219 fedEmulator_.initialiseModule(lDetId,lNPairs,lPair);
00220
00221
00222
00223 fedEmulator_.retrievePedestals(lPedsHandle);
00224 fedEmulator_.retrieveNoises(lNoiseHandle);
00225
00226
00227
00228
00229 fedEmulator_.subtractPedestals(inputChannel,
00230 pedsDetSetData,
00231 noiseDetSetData,
00232 pedSubtrDetSetData,
00233 medsDetSetData,
00234 true);
00235
00236 fedEmulator_.subtractCM(pedSubtrDetSetData,cmSubtrDetSetData);
00237
00238
00239 medsData[inputChannel->detId()] = medsDetSetData;
00240
00241
00242 fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
00243 if (zsDetSetData.size()) zsData.push_back( zsDetSetData );
00244
00245 }
00246
00247
00248 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData,true));
00249 std::auto_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData,true));
00250
00251 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(new edm::DetSetVector<SiStripRawDigi>(pedSubtrData,true));
00252
00253 std::auto_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(new edm::DetSetVector<SiStripRawDigi>(cmSubtrData,true));
00254
00255 std::auto_ptr<std::map<uint32_t,std::vector<uint32_t> > > lMedians(new std::map<uint32_t,std::vector<uint32_t> >(medsData));
00256
00257
00258 std::auto_ptr< edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
00259
00260 if (!byModule_) {
00261 iEvent.put(lMedians,"Medians");
00262 iEvent.put(lPeds,"PedestalsOrdered");
00263 iEvent.put(lNoises,"NoisesOrdered");
00264 iEvent.put(lOutputPedSubtr,"PedSubtrDigisOrdered");
00265 iEvent.put(lOutputCMSubtr,"CMSubtrDigisOrdered");
00266 }
00267 else {
00268 iEvent.put(lPeds,"ModulePedestals");
00269 iEvent.put(lNoises,"ModuleNoises");
00270 iEvent.put(lOutputPedSubtr,"PedSubtrModuleDigis");
00271 iEvent.put(lMedians,"ModuleMedians");
00272 iEvent.put(lOutputCMSubtr,"CMSubtrModuleDigis");
00273 iEvent.put(lOutputZS,"ZSModuleDigis");
00274 }
00275
00276 }
00277 }
00278
00279
00280
00281
00282
00283 #include "FWCore/Framework/interface/MakerMacros.h"
00284 typedef sistrip::FEDEmulatorModule SiStripFEDEmulatorModule;
00285 DEFINE_FWK_MODULE(SiStripFEDEmulatorModule);