CMS 3D CMS Logo

SiStripFEDEmulatorModule.cc
Go to the documentation of this file.
1 // Original Author: Anne-Marie Magnan
2 // Created: 2010/01/21
3 //
4 
5 #include <sstream>
6 #include <memory>
7 #include <list>
8 #include <algorithm>
9 #include <cassert>
10 #include <vector>
11 
23 
33 
37 
39 
40 //for the zero suppression algorithm(s)
43 
46 
47 using edm::LogError;
48 using edm::LogInfo;
49 using edm::LogWarning;
50 
51 namespace sistrip {
52 
53  //
54  // Class declaration
55  //
56 
58  public:
59  explicit FEDEmulatorModule(const edm::ParameterSet&);
60  ~FEDEmulatorModule() override;
61 
62  private:
63  void produce(edm::Event&, const edm::EventSetup&) override;
64  //virtual void endJob();
65 
66  //tag of spydata collection
71 
72  //by fedIndex or module detid
73  bool byModule_;
74 
76 
77  static const char* messageLabel_;
78 
79  std::unique_ptr<SiStripRawProcessingAlgorithms> algorithms_;
80 
81  //utilities for cabling etc...
83  };
84 
85 } // namespace sistrip
86 
87 namespace sistrip {
88 
89  //
90  // Constructors and destructor
91  //
92  const char* FEDEmulatorModule::messageLabel_ = "SiStripFEDEmulatorModule";
93 
95  : spyReorderedDigisTag_(iConfig.getParameter<edm::InputTag>("SpyReorderedDigisTag")),
96  spyVirginRawDigisTag_(iConfig.getParameter<edm::InputTag>("SpyVirginRawDigisTag")),
97  byModule_(iConfig.getParameter<bool>("ByModule")),
98  algorithms_(SiStripRawProcessingFactory::create(iConfig.getParameter<edm::ParameterSet>("Algorithms"),
99  consumesCollector())) {
100  spyReorderedDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyReorderedDigisTag_);
101  spyVirginRawDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyVirginRawDigisTag_);
102 
104 
105  if (!byModule_) { //if not by module
106  //the medians will be produced by fed id/channel
107  produces<std::map<uint32_t, std::vector<uint32_t> > >("Medians");
108  produces<edm::DetSetVector<SiStripRawDigi> >("PedestalsOrdered");
109  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("NoisesOrdered");
110  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrDigisOrdered");
111  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrDigisOrdered");
112  } else { //by module
113  produces<edm::DetSetVector<SiStripRawDigi> >("ModulePedestals");
114  produces<edm::DetSetVector<SiStripProcessedRawDigi> >("ModuleNoises");
115  produces<edm::DetSetVector<SiStripRawDigi> >("PedSubtrModuleDigis");
116  produces<std::map<uint32_t, std::vector<uint32_t> > >("ModuleMedians");
117  produces<edm::DetSetVector<SiStripRawDigi> >("CMSubtrModuleDigis");
118  produces<edm::DetSetVector<SiStripDigi> >("ZSModuleDigis");
119  } //end of by module check
120 
121  } //end of FEDEmulatorModule constructor
122 
124 
125  // ------------ method called to for each event ------------
127  //update cabling and pedestals
128  const SiStripFedCabling* lCabling = utility_.getCabling(iSetup);
131 
132  //initialise the algorithms object for the zero suppression
133  algorithms_->initialize(iSetup);
134 
135  //retrieve the digis
137  try { //to get the digis from the event
138  if (!byModule_) {
139  iEvent.getByToken(spyReorderedDigisToken_, lDigisHandle);
140  } else { //digis supplied by module
141  iEvent.getByToken(spyVirginRawDigisToken_, lDigisHandle);
142  } //end of by module check
143  } catch (const cms::Exception& e) {
144  std::cout << e.what();
145  return;
146  } //end of get digis try
147 
148  const edm::DetSetVector<SiStripRawDigi>* lInputDigis = lDigisHandle.product();
149 
150  unsigned int lNDigis = lInputDigis->size();
151 
152  //define output containers
153  //reserve space, will push_back elements
154  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedsData;
155  pedsData.reserve(lNDigis);
156  std::vector<edm::DetSetVector<SiStripProcessedRawDigi>::detset> noiseData;
157  noiseData.reserve(lNDigis);
158  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> pedSubtrData;
159  pedSubtrData.reserve(lNDigis);
160  std::vector<edm::DetSetVector<SiStripRawDigi>::detset> cmSubtrData;
161  cmSubtrData.reserve(lNDigis);
162  //zero suppressed contained - no fixed size (could be empty) so no need to reserve elements.
163  std::vector<edm::DetSet<SiStripDigi> > zsData;
164 
165  //this is a map: no reserve/resize
166  std::map<uint32_t, std::vector<uint32_t> > medsData;
167 
168  edm::DetSetVector<SiStripRawDigi>::const_iterator inputChannel = lInputDigis->begin();
169 
170  for (; inputChannel != lInputDigis->end(); ++inputChannel) { //loop on input channels
171  uint32_t lDetId = inputChannel->detId(); //either fedIndex or detId
172 
173  pedsData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
174  noiseData.push_back(edm::DetSetVector<SiStripProcessedRawDigi>::detset(lDetId));
175  pedSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
176  cmSubtrData.push_back(edm::DetSetVector<SiStripRawDigi>::detset(lDetId));
177 
178  unsigned int lNStrips = inputChannel->size();
179 
180  //define output digi containers
181  std::vector<SiStripRawDigi>& pedsDetSetData = pedsData.back().data;
182  pedsDetSetData.reserve(lNStrips);
183  std::vector<SiStripProcessedRawDigi>& noiseDetSetData = noiseData.back().data;
184  noiseDetSetData.reserve(lNStrips);
185  std::vector<SiStripRawDigi>& pedSubtrDetSetData = pedSubtrData.back().data;
186  pedSubtrDetSetData.reserve(lNStrips);
187  std::vector<SiStripRawDigi>& cmSubtrDetSetData = cmSubtrData.back().data;
188  cmSubtrDetSetData.reserve(lNStrips);
189  //zero suppressed - slightly different procedure as not fixed size
190  edm::DetSet<SiStripDigi> zsDetSetData(lDetId);
191 
192  //determine the number of APV pairs in the channel
193  uint32_t lNPairs = static_cast<uint32_t>(lNStrips * 1. / sistrip::STRIPS_PER_FEDCH);
194  uint32_t lPair = 0;
195 
196  std::vector<uint32_t> medsDetSetData;
197  medsDetSetData.reserve(lNPairs * 2); //2*number of pairs per module. If not by module, lNPairs = 1...
198 
199  if (!byModule_) { //the input is not stored by module
200  //need to retrieve the proper detId from cabling
201  uint16_t lFedId = 0;
202  uint16_t lFedChannel = 0;
203  sistrip::SpyUtilities::fedIndex(lDetId, lFedId, lFedChannel);
204 
205  const FedChannelConnection& lConnection = lCabling->fedConnection(lFedId, lFedChannel);
206  lDetId = lConnection.detId();
207  lNPairs = lConnection.nApvPairs();
208  lPair = lConnection.apvPairNumber();
209  } //end of by module check
210 
211  fedEmulator_.initialiseModule(lDetId, lNPairs, lPair);
212 
213  //get the pedestal values
214  //stored by module in the database
215  fedEmulator_.retrievePedestals(lPedsHandle);
216  fedEmulator_.retrieveNoises(lNoiseHandle);
217 
218  //last option: fill medians from these ped subtr data
219  //if want something else, need to call a method to fill
220  //the data member medians_ of the class fedEmulator.
222  inputChannel, pedsDetSetData, noiseDetSetData, pedSubtrDetSetData, medsDetSetData, true);
223 
224  fedEmulator_.subtractCM(pedSubtrDetSetData, cmSubtrDetSetData);
225 
226  //fill the median map
227  medsData[inputChannel->detId()] = medsDetSetData;
228 
229  //zero suppress the digis
230  fedEmulator_.zeroSuppress(cmSubtrDetSetData, zsDetSetData, algorithms_);
231  if (!zsDetSetData.empty())
232  zsData.push_back(zsDetSetData);
233 
234  } //loop on input channels
235 
236  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lPeds(new edm::DetSetVector<SiStripRawDigi>(pedsData, true));
237  std::unique_ptr<edm::DetSetVector<SiStripProcessedRawDigi> > lNoises(
238  new edm::DetSetVector<SiStripProcessedRawDigi>(noiseData, true));
239 
240  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputPedSubtr(
241  new edm::DetSetVector<SiStripRawDigi>(pedSubtrData, true));
242 
243  std::unique_ptr<edm::DetSetVector<SiStripRawDigi> > lOutputCMSubtr(
244  new edm::DetSetVector<SiStripRawDigi>(cmSubtrData, true));
245 
246  std::unique_ptr<std::map<uint32_t, std::vector<uint32_t> > > lMedians(
247  new std::map<uint32_t, std::vector<uint32_t> >(medsData));
248 
249  //zero suppressed digis
250  std::unique_ptr<edm::DetSetVector<SiStripDigi> > lOutputZS(new edm::DetSetVector<SiStripDigi>(zsData));
251 
252  if (!byModule_) {
253  iEvent.put(std::move(lMedians), "Medians");
254  iEvent.put(std::move(lPeds), "PedestalsOrdered");
255  iEvent.put(std::move(lNoises), "NoisesOrdered");
256  iEvent.put(std::move(lOutputPedSubtr), "PedSubtrDigisOrdered");
257  iEvent.put(std::move(lOutputCMSubtr), "CMSubtrDigisOrdered");
258  } else {
259  iEvent.put(std::move(lPeds), "ModulePedestals");
260  iEvent.put(std::move(lNoises), "ModuleNoises");
261  iEvent.put(std::move(lOutputPedSubtr), "PedSubtrModuleDigis");
262  iEvent.put(std::move(lMedians), "ModuleMedians");
263  iEvent.put(std::move(lOutputCMSubtr), "CMSubtrModuleDigis");
264  iEvent.put(std::move(lOutputZS), "ZSModuleDigis");
265  }
266 
267  } //produce method
268 } //namespace sistrip
269 
270 //
271 // Define as a plug-in
272 //
273 
FedChannelConnection::nApvPairs
const uint16_t & nApvPairs() const
Definition: FedChannelConnection.h:215
sistrip::FEDEmulatorModule::spyVirginRawDigisToken_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyVirginRawDigisToken_
Definition: SiStripFEDEmulatorModule.cc:70
FEDNumbering.h
edm::DetSetVector< SiStripRawDigi >
SiStripRawProcessingFactory.h
sistrip::FEDEmulator::retrievePedestals
void retrievePedestals(const edm::ESHandle< SiStripPedestals > &aHandle)
Definition: SiStripFEDEmulator.cc:60
electrons_cff.bool
bool
Definition: electrons_cff.py:393
MessageLogger.h
sistrip::FEDEmulator::subtractPedestals
void subtractPedestals(const edm::DetSetVector< SiStripRawDigi >::const_iterator &inputChannel, std::vector< SiStripRawDigi > &pedsDetSetData, std::vector< SiStripProcessedRawDigi > &noiseDetSetData, std::vector< SiStripRawDigi > &pedSubtrDetSetData, std::vector< uint32_t > &medsDetSetData, const bool fillApvsForCM)
Definition: SiStripFEDEmulator.cc:84
edm::Handle::product
T const * product() const
Definition: Handle.h:70
EDProducer.h
ESHandle.h
edm::DetSetVector::end
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:325
edm::DetSet
Definition: DetSet.h:23
SiStripRawProcessingFactory
Definition: SiStripRawProcessingFactory.h:15
edm::EDGetTokenT
Definition: EDGetToken.h:33
sistrip::FEDEmulatorModule::byModule_
bool byModule_
Definition: SiStripFEDEmulatorModule.cc:73
edm
HLT enums.
Definition: AlignableModifier.h:19
SiStripRawDigi.h
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89287
SiStripFedCabling.h
edm::DetSetVector::begin
iterator begin()
Return an iterator to the first DetSet.
Definition: DetSetVector.h:314
SiStripFedCabling::fedConnection
FedChannelConnection fedConnection(uint16_t fed_id, uint16_t fed_ch) const
Definition: SiStripFedCabling.cc:171
sistrip::SpyUtilities::getNoiseHandle
edm::ESHandle< SiStripNoises > getNoiseHandle(const edm::EventSetup &eventSetup)
Definition: SiStripSpyUtilities.cc:98
SiStripNoises.h
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
beamerCreator.create
def create(alignables, pedeDump, additionalData, outputFile, config)
Definition: beamerCreator.py:44
ConstantsForHardwareSystems.h
Constants and enumerated types for FED/FEC systems.
sistrip::SpyUtilities::getPedestalHandle
edm::ESHandle< SiStripPedestals > getPedestalHandle(const edm::EventSetup &eventSetup)
Definition: SiStripSpyUtilities.cc:87
SiStripFedCabling
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses,...
Definition: SiStripFedCabling.h:25
FEDRawData.h
edm::Handle
Definition: AssociativeIterator.h:50
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
sistrip::FEDEmulator::initialiseModule
void initialiseModule(const uint32_t aDetId, const uint32_t aNPairs, const uint32_t aPair)
Definition: SiStripFEDEmulator.cc:37
SiStripSpyUtilities.h
edm::DetSet::empty
bool empty() const
Definition: DetSet.h:62
MakerMacros.h
sistrip::FEDEmulator::subtractCM
void subtractCM(const std::vector< SiStripRawDigi > &pedSubtrDetSetData, std::vector< SiStripRawDigi > &cmSubtrDetSetData)
Definition: SiStripFEDEmulator.cc:169
SiStripFEDEmulator.h
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
SiStripProcessedRawDigi.h
sistrip::FEDEmulatorModule::spyReorderedDigisTag_
edm::InputTag spyReorderedDigisTag_
Definition: SiStripFEDEmulatorModule.cc:67
sistrip::FEDEmulatorModule
Definition: SiStripFEDEmulatorModule.cc:57
SiStripFEDBuffer.h
Service.h
sistrip::SpyUtilities
Definition: SiStripSpyUtilities.h:24
sistrip::FEDEmulatorModule::produce
void produce(edm::Event &, const edm::EventSetup &) override
Definition: SiStripFEDEmulatorModule.cc:126
SiStripDigi.h
edm::ESHandle< SiStripPedestals >
sistrip::FEDEmulator::zeroSuppress
void zeroSuppress(const std::vector< SiStripRawDigi > &cmSubtrDetSetData, edm::DetSet< SiStripDigi > &zsDetSetData, const std::unique_ptr< SiStripRawProcessingAlgorithms > &algorithms)
Definition: SiStripFEDEmulator.cc:190
sistrip::FEDEmulatorModule::~FEDEmulatorModule
~FEDEmulatorModule() override
Definition: SiStripFEDEmulatorModule.cc:123
edm::DetSetVector::size
size_type size() const
Return the number of contained DetSets.
Definition: DetSetVector.h:259
sistrip::FEDEmulatorModule::spyReorderedDigisToken_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyReorderedDigisToken_
Definition: SiStripFEDEmulatorModule.cc:69
EDGetToken.h
sistrip::FEDEmulator::initialise
void initialise(const bool byModule)
Definition: SiStripFEDEmulator.cc:30
FedChannelConnection
Class containning control, module, detector and connection information, at the level of a FED channel...
Definition: FedChannelConnection.h:26
FedChannelConnection::detId
const uint32_t & detId() const
Definition: FedChannelConnection.h:213
sistrip::FEDEmulatorModule::utility_
SpyUtilities utility_
Definition: SiStripFEDEmulatorModule.cc:82
SiStripFedKey.h
edm::ParameterSet
Definition: ParameterSet.h:47
Event.h
ParameterSet
Definition: Functions.h:16
sistrip::FEDEmulator
Definition: SiStripFEDEmulator.h:35
edm::DetSetVector::const_iterator
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
sistrip::STRIPS_PER_FEDCH
static const uint16_t STRIPS_PER_FEDCH
Definition: ConstantsForHardwareSystems.h:44
sistrip::FEDEmulator::retrieveNoises
void retrieveNoises(const edm::ESHandle< SiStripNoises > &aHandle)
Definition: SiStripFEDEmulator.cc:72
iEvent
int iEvent
Definition: GenABIO.cc:224
FEDRawDataCollection.h
SiStripRawProcessingAlgorithms.h
sistrip::FEDEmulatorModule::FEDEmulatorModule
FEDEmulatorModule(const edm::ParameterSet &)
Definition: SiStripFEDEmulatorModule.cc:94
edm::EventSetup
Definition: EventSetup.h:57
DetSetVector.h
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
sistrip::FEDEmulatorModule::messageLabel_
static const char * messageLabel_
Definition: SiStripFEDEmulatorModule.cc:77
sistrip::FEDEmulatorModule::spyVirginRawDigisTag_
edm::InputTag spyVirginRawDigisTag_
Definition: SiStripFEDEmulatorModule.cc:68
InputTag.h
sistrip::SpyUtilities::getCabling
const SiStripFedCabling * getCabling(const edm::EventSetup &)
Updates the cabling object from the DB.
Definition: SiStripSpyUtilities.cc:37
eostools.move
def move(src, dest)
Definition: eostools.py:511
Frameworkfwd.h
SiStripFEDEmulatorModule
sistrip::FEDEmulatorModule SiStripFEDEmulatorModule
Definition: SiStripFEDEmulatorModule.cc:275
SiStripPedestals.h
EventSetup.h
edm::EDProducer
Definition: EDProducer.h:35
Exception.h
FedChannelConnection::apvPairNumber
uint16_t apvPairNumber() const
Definition: FedChannelConnection.h:230
cms::Exception
Definition: Exception.h:70
genParticles_cff.map
map
Definition: genParticles_cff.py:11
ParameterSet.h
sistrip
sistrip classes
Definition: SiStripQualityHelpers.h:14
edm::Event
Definition: Event.h:73
sistrip::FEDEmulatorModule::algorithms_
std::unique_ptr< SiStripRawProcessingAlgorithms > algorithms_
object for zero-suppression
Definition: SiStripFEDEmulatorModule.cc:79
edm::InputTag
Definition: InputTag.h:15
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
sistrip::FEDEmulatorModule::fedEmulator_
sistrip::FEDEmulator fedEmulator_
Definition: SiStripFEDEmulatorModule.cc:75
sistrip::SpyUtilities::fedIndex
static void fedIndex(uint32_t aFedIndex, uint16_t &aFedId, uint16_t &aFedChannel)
Definition: SiStripSpyUtilities.cc:398