1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
// Original Author: Anne-Marie Magnan
// Created: 2010/01/21
//
#include <sstream>
#include <memory>
#include <list>
#include <algorithm>
#include <cassert>
#include <vector>
#include "FWCore/Utilities/interface/EDGetToken.h"
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/stream/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESWatcher.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "DataFormats/FEDRawData/interface/FEDRawData.h"
#include "DataFormats/FEDRawData/interface/FEDNumbering.h"
#include "DataFormats/SiStripCommon/interface/SiStripFedKey.h"
#include "DataFormats/Common/interface/DetSetVector.h"
#include "DataFormats/SiStripDigi/interface/SiStripRawDigi.h"
#include "DataFormats/SiStripDigi/interface/SiStripProcessedRawDigi.h"
#include "DataFormats/SiStripDigi/interface/SiStripDigi.h"
#include "DataFormats/SiStripCommon/interface/ConstantsForHardwareSystems.h"
#include "CondFormats/SiStripObjects/interface/SiStripPedestals.h"
#include "CondFormats/SiStripObjects/interface/SiStripNoises.h"
#include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
#include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h"
//for the zero suppression algorithm(s)
#include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingFactory.h"
#include "RecoLocalTracker/SiStripZeroSuppression/interface/SiStripRawProcessingAlgorithms.h"
#include "DQM/SiStripMonitorHardware/interface/SiStripFEDEmulator.h"
#include "DQM/SiStripMonitorHardware/interface/SiStripSpyUtilities.h"
using edm::LogError;
using edm::LogInfo;
using edm::LogWarning;
namespace sistrip {
//
// Class declaration
//
class FEDEmulatorModule : public edm::stream::EDProducer<> {
public:
explicit FEDEmulatorModule(const edm::ParameterSet&);
~FEDEmulatorModule() override;
private:
void produce(edm::Event&, const edm::EventSetup&) override;
//virtual void endJob();
//tag of spydata collection
edm::InputTag spyReorderedDigisTag_;
edm::InputTag spyVirginRawDigisTag_;
edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > spyReorderedDigisToken_;
edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > spyVirginRawDigisToken_;
//by fedIndex or module detid
bool byModule_;
sistrip::FEDEmulator fedEmulator_;
static const char* const messageLabel_;
std::unique_ptr<SiStripRawProcessingAlgorithms> algorithms_; //!< object for zero-suppression
edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> fedCablingToken_;
edm::ESGetToken<SiStripPedestals, SiStripPedestalsRcd> pedestalsToken_;
edm::ESGetToken<SiStripNoises, SiStripNoisesRcd> noisesToken_;
const SiStripFedCabling* fedCabling_;
const SiStripPedestals* pedestals_;
const SiStripNoises* noises_;
edm::ESWatcher<SiStripFedCablingRcd> cablingWatcher_;
edm::ESWatcher<SiStripPedestalsRcd> pedestalsWatcher_;
edm::ESWatcher<SiStripNoisesRcd> noisesWatcher_;
void updateFedCabling(const SiStripFedCablingRcd& rcd);
void updatePedestals(const SiStripPedestalsRcd& rcd);
void updateNoises(const SiStripNoisesRcd& rcd);
};
} // namespace sistrip
namespace sistrip {
//
// Constructors and destructor
//
const char* const FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
FEDEmulatorModule::FEDEmulatorModule(const edm::ParameterSet& iConfig)
: spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
byModule_(iConfig.getParameter<bool>("ByModule")),
algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms"),
consumesCollector())),
fedCablingToken_(esConsumes<>()),
pedestalsToken_(esConsumes<>()),
noisesToken_(esConsumes<>()),
cablingWatcher_(this, &sistrip::FEDEmulatorModule::updateFedCabling),
pedestalsWatcher_(this, &sistrip::FEDEmulatorModule::updatePedestals),
noisesWatcher_(this, &sistrip::FEDEmulatorModule::updateNoises) {
spyReorderedDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyReorderedDigisTag_);
spyVirginRawDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyVirginRawDigisTag_);
fedEmulator_.initialise(byModule_);
if (!byModule_) { //if not by module
//the medians will be produced by fed id/channel
produces<std::map<uint32_t, std::vector<uint32_t> > >("Medians");
produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
} else { //by module
produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
produces<std::map<uint32_t, std::vector<uint32_t> > >("ModuleMedians");
produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
} //end of by module check
} //end of FEDEmulatorModule constructor
FEDEmulatorModule::~FEDEmulatorModule() {}
void FEDEmulatorModule::updateFedCabling(const SiStripFedCablingRcd& rcd) {
fedCabling_ = &rcd.get(fedCablingToken_);
}
void FEDEmulatorModule::updatePedestals(const SiStripPedestalsRcd& rcd) { pedestals_ = &rcd.get(pedestalsToken_); }
void FEDEmulatorModule::updateNoises(const SiStripNoisesRcd& rcd) { noises_ = &rcd.get(noisesToken_); }
// ------------ method called to for each event ------------
void FEDEmulatorModule::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
cablingWatcher_.check(iSetup);
pedestalsWatcher_.check(iSetup);
noisesWatcher_.check(iSetup);
//initialise the algorithms object for the zero suppression
algorithms_->initialize(iSetup);
//retrieve the digis
edm::Handle<edm::DetSetVector<SiStripRawDigi> > lDigisHandle;
try { //to get the digis from the event
if (!byModule_) {
iEvent.getByToken(spyReorderedDigisToken_, lDigisHandle);
} else { //digis supplied by module
iEvent.getByToken(spyVirginRawDigisToken_, lDigisHandle);
} //end of by module check
} catch (const cms::Exception& e) {
std::cout << e.what();
return;
} //end of get digis try
const edm::DetSetVector<SiStripRawDigi>* lInputDigis = lDigisHandle.product();
unsigned int lNDigis = lInputDigis->size();
//define output containers
//reserve space, will push_back elements
std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedsData;
pedsData.reserve(lNDigis);
std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset> noiseData;
noiseData.reserve(lNDigis);
std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedSubtrData;
pedSubtrData.reserve(lNDigis);
std::vector<edm::DetSetVector<SiStripRawDigi>::detset> cmSubtrData;
cmSubtrData.reserve(lNDigis);
//zero suppressed contained - no fixed size (could be empty) so no need to reserve elements.
std::vector<edm::DetSet<SiStripDigi> > zsData;
//this is a map: no reserve/resize
std::map<uint32_t, std::vector<uint32_t> > medsData;
edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
for (; inputChannel != lInputDigis->end(); ++inputChannel) { //loop on input channels
uint32_t lDetId = inputChannel->detId(); //either fedIndex or detId
pedsData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
noiseData.push_back(edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId));
pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
cmSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
unsigned int lNStrips = inputChannel->size();
//define output digi containers
std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
pedsDetSetData.reserve(lNStrips);
std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
noiseDetSetData.reserve(lNStrips);
std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
pedSubtrDetSetData.reserve(lNStrips);
std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
cmSubtrDetSetData.reserve(lNStrips);
//zero suppressed - slightly different procedure as not fixed size
edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
//determine the number of APV pairs in the channel
uint32_t lNPairs = static_cast<uint32_t>(lNStrips * 1. / sistrip::STRIPS_PER_FEDCH);
uint32_t lPair = 0;
std::vector<uint32_t> medsDetSetData;
medsDetSetData.reserve(lNPairs * 2); //2*number of pairs per module. If not by module, lNPairs = 1...
if (!byModule_) { //the input is not stored by module
//need to retrieve the proper detId from cabling
uint16_t lFedId = 0;
uint16_t lFedChannel = 0;
sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
const FedChannelConnection& lConnection = fedCabling_->fedConnection(lFedId, lFedChannel);
lDetId = lConnection.detId();
lNPairs = lConnection.nApvPairs();
lPair = lConnection.apvPairNumber();
} //end of by module check
fedEmulator_.initialiseModule(lDetId, lNPairs, lPair);
//get the pedestal values
//stored by module in the database
fedEmulator_.retrievePedestals(pedestals_); // FIXME maybe move into FEDEmulator then?
fedEmulator_.retrieveNoises(noises_);
//last option: fill medians from these ped subtr data
//if want something else, need to call a method to fill
//the data member medians_ of the class fedEmulator.
fedEmulator_.subtractPedestals(
inputChannel, pedsDetSetData, noiseDetSetData, pedSubtrDetSetData, medsDetSetData, true);
fedEmulator_.subtractCM(pedSubtrDetSetData, cmSubtrDetSetData);
//fill the median map
medsData[inputChannel->detId()] = medsDetSetData;
//zero suppress the digis
fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
if (!zsDetSetData.empty())
zsData.push_back(zsDetSetData);
} //loop on input channels
std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData, true));
std::unique_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(
new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData, true));
std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(
new edm::DetSetVector<SiStripRawDigi>(pedSubtrData, true));
std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(
new edm::DetSetVector<SiStripRawDigi>(cmSubtrData, true));
std::unique_ptr<std::map<uint32_t, std::vector<uint32_t> > > lMedians(
new std::map<uint32_t, std::vector<uint32_t> >(medsData));
//zero suppressed digis
std::unique_ptr<edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
if (!byModule_) {
iEvent.put(std::move(lMedians), "Medians");
iEvent.put(std::move(lPeds), "PedestalsOrdered");
iEvent.put(std::move(lNoises), "NoisesOrdered");
iEvent.put(std::move(lOutputPedSubtr), "PedSubtrDigisOrdered");
iEvent.put(std::move(lOutputCMSubtr), "CMSubtrDigisOrdered");
} else {
iEvent.put(std::move(lPeds), "ModulePedestals");
iEvent.put(std::move(lNoises), "ModuleNoises");
iEvent.put(std::move(lOutputPedSubtr), "PedSubtrModuleDigis");
iEvent.put(std::move(lMedians), "ModuleMedians");
iEvent.put(std::move(lOutputCMSubtr), "CMSubtrModuleDigis");
iEvent.put(std::move(lOutputZS), "ZSModuleDigis");
}
} //produce method
} //namespace sistrip
//
// Define as a plug-in
//
#include "FWCore/Framework/interface/MakerMacros.h"
typedef sistrip::FEDEmulatorModule SiStripFEDEmulatorModule;
DEFINE_FWK_MODULE(SiStripFEDEmulatorModule);
|