CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
SiStripSpyMonitorModule Class Reference
Inheritance diagram for SiStripSpyMonitorModule:
DQMEDAnalyzer edm::stream::EDProducer< edm::GlobalCache< DQMEDAnalyzerGlobalCache >, edm::EndRunProducer, edm::EndLuminosityBlockProducer, edm::Accumulator >

Public Member Functions

 SiStripSpyMonitorModule (const edm::ParameterSet &)
 
 ~SiStripSpyMonitorModule () override
 
- Public Member Functions inherited from DQMEDAnalyzer
void accumulate (edm::Event const &event, edm::EventSetup const &setup) final
 
void beginLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &setup) final
 
void beginRun (edm::Run const &run, edm::EventSetup const &setup) final
 
void beginStream (edm::StreamID id) final
 
 DQMEDAnalyzer ()
 
void endLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &setup) final
 
void endRun (edm::Run const &run, edm::EventSetup const &setup) final
 
virtual bool getCanSaveByLumi ()
 
- Public Member Functions inherited from edm::stream::EDProducer< edm::GlobalCache< DQMEDAnalyzerGlobalCache >, edm::EndRunProducer, edm::EndLuminosityBlockProducer, edm::Accumulator >
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Private Member Functions

void analyze (const edm::Event &, const edm::EventSetup &) override
 
void bookHistograms (DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
 
void dqmBeginRun (const edm::Run &, const edm::EventSetup &) override
 
edm::DetSetVector
< SiStripRawDigi >
::detset::const_iterator 
findTwoConsecutive (const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, const uint16_t threshold, uint16_t &aCounter)
 
bool hasNegativePedSubtr (const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, uint16_t aPair)
 
bool identifyTickmarks (const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, const uint16_t threshold)
 
void updateFedCabling (const SiStripFedCablingRcd &rcd)
 

Private Attributes

edm::ESWatcher
< SiStripFedCablingRcd
cablingWatcher_
 
edm::EventNumber_t evt_
 
const SiStripFedCablingfedCabling_
 
edm::ESGetToken
< SiStripFedCabling,
SiStripFedCablingRcd
fedCablingToken_
 
bool fillAllDetailedHistograms_
 
bool fillWithEvtNum_
 
bool fillWithLocalEvtNum_
 
uint16_t firstHeaderBit_
 
uint16_t firstTrailerBit_
 
std::string folderName_
 
sistrip::SpyUtilities::FrameQuality frameQuality_
 
SPYHistograms histManager_
 
uint32_t maxDigiRange_
 
uint32_t maxDigitalHigh_
 
uint32_t maxDigitalLow_
 
uint32_t minDigiRange_
 
uint32_t minDigitalHigh_
 
uint32_t minDigitalLow_
 
std::ofstream outfile_ [20]
 
std::map< std::string,
unsigned int > 
outfileMap_
 
std::vector< std::string > outfileNames_
 
edm::InputTag spyAPVeTag_
 
edm::EDGetTokenT< std::vector
< uint32_t > > 
spyAPVeToken_
 
edm::InputTag spyL1Tag_
 
edm::EDGetTokenT< std::vector
< uint32_t > > 
spyL1Token_
 
edm::InputTag spyPedSubtrDigisTag_
 
edm::EDGetTokenT
< edm::DetSetVector
< SiStripRawDigi > > 
spyPedSubtrDigisToken_
 
edm::InputTag spyScopeRawDigisTag_
 
edm::EDGetTokenT
< edm::DetSetVector
< SiStripRawDigi > > 
spyScopeRawDigisToken_
 
edm::InputTag spyTotCountTag_
 
edm::EDGetTokenT< std::vector
< uint32_t > > 
spyTotCountToken_
 
edm::ESGetToken< TkDetMap,
TrackerTopologyRcd
tkDetMapToken_
 
bool writeCabling_
 

Additional Inherited Members

- Public Types inherited from DQMEDAnalyzer
typedef dqm::reco::DQMStore DQMStore
 
typedef dqm::reco::MonitorElement MonitorElement
 
- Public Types inherited from edm::stream::EDProducer< edm::GlobalCache< DQMEDAnalyzerGlobalCache >, edm::EndRunProducer, edm::EndLuminosityBlockProducer, edm::Accumulator >
using CacheTypes = CacheContexts< T...>
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T...>
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 
- Static Public Member Functions inherited from DQMEDAnalyzer
static void globalEndJob (DQMEDAnalyzerGlobalCache const *)
 
static void globalEndLuminosityBlockProduce (edm::LuminosityBlock &lumi, edm::EventSetup const &setup, LuminosityBlockContext const *context)
 
static void globalEndRunProduce (edm::Run &run, edm::EventSetup const &setup, RunContext const *context)
 
static std::unique_ptr
< DQMEDAnalyzerGlobalCache
initializeGlobalCache (edm::ParameterSet const &)
 
- Protected Member Functions inherited from DQMEDAnalyzer
uint64_t meId () const
 
- Protected Attributes inherited from DQMEDAnalyzer
edm::EDPutTokenT< DQMTokenlumiToken_
 
edm::EDPutTokenT< DQMTokenrunToken_
 
unsigned int streamId_
 

Detailed Description

Definition at line 50 of file SiStripSpyMonitorModule.cc.

Constructor & Destructor Documentation

SiStripSpyMonitorModule::SiStripSpyMonitorModule ( const edm::ParameterSet iConfig)
explicit

Definition at line 127 of file SiStripSpyMonitorModule.cc.

References evt_, frameQuality_, edm::ParameterSet::getUntrackedParameter(), histManager_, mps_fire::i, SPYHistograms::initialise(), sistrip::SpyUtilities::FrameQuality::maxDigiRange, sistrip::SpyUtilities::FrameQuality::maxTickHeight, sistrip::SpyUtilities::FrameQuality::maxZeroLight, sistrip::SpyUtilities::FrameQuality::minDigiRange, sistrip::SpyUtilities::FrameQuality::minTickHeight, sistrip::SpyUtilities::FrameQuality::minZeroLight, cmsBatch::nFiles, submitPVResolutionJobs::out, outfile_, outfileMap_, outfileNames_, spyAPVeTag_, spyAPVeToken_, spyL1Tag_, spyL1Token_, spyPedSubtrDigisTag_, spyPedSubtrDigisToken_, spyScopeRawDigisTag_, spyScopeRawDigisToken_, spyTotCountTag_, and spyTotCountToken_.

129  "SpyScopeRawDigisTag", edm::InputTag("SiStripSpyUnpacker", "ScopeRawDigis"))),
131  iConfig.getUntrackedParameter<edm::InputTag>("SpyPedSubtrDigisTag", edm::InputTag("SiStripFEDEmulator", ""))),
132  spyL1Tag_(iConfig.getUntrackedParameter<edm::InputTag>("SpyL1Tag",
133  edm::InputTag("SiStripSpyDigiConverter", "L1ACount"))),
135  "SpyTotalEventCountTag", edm::InputTag("SiStripSpyDigiConverter", "TotalEventCount"))),
136  spyAPVeTag_(iConfig.getUntrackedParameter<edm::InputTag>("SpyAPVeTag",
137  edm::InputTag("SiStripSpyDigiConverter", "APVAddress"))),
138  folderName_(iConfig.getUntrackedParameter<std::string>("HistogramFolderName",
139  "SiStrip/ReadoutView/SpyMonitoringSummary")),
140  fillAllDetailedHistograms_(iConfig.getUntrackedParameter<bool>("FillAllDetailedHistograms", false)),
141  fillWithEvtNum_(iConfig.getUntrackedParameter<bool>("FillWithEventNumber", false)),
142  fillWithLocalEvtNum_(iConfig.getUntrackedParameter<bool>("FillWithLocalEventNumber", false)),
143  firstHeaderBit_(0),
144  firstTrailerBit_(0),
145  outfileNames_(iConfig.getUntrackedParameter<std::vector<std::string> >("OutputErrors")),
146  writeCabling_(iConfig.getUntrackedParameter<bool>("WriteCabling", false)),
147  tkDetMapToken_(esConsumes<edm::Transition::BeginRun>()),
148  fedCablingToken_(esConsumes<>()),
150  spyScopeRawDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyScopeRawDigisTag_);
151  spyPedSubtrDigisToken_ = consumes<edm::DetSetVector<SiStripRawDigi> >(spyPedSubtrDigisTag_);
152 
153  spyL1Token_ = consumes<std::vector<uint32_t> >(spyL1Tag_);
154  spyTotCountToken_ = consumes<std::vector<uint32_t> >(spyTotCountTag_);
155  spyAPVeToken_ = consumes<std::vector<uint32_t> >(spyAPVeTag_);
156 
157  evt_ = 0;
158  std::ostringstream pDebugStream;
159  histManager_.initialise(iConfig, &pDebugStream);
160  const unsigned int nFiles = outfileNames_.size();
161 
162  for (unsigned int i(0); i < nFiles; i++) {
163  std::ostringstream lName;
164  lName << outfileNames_.at(i) << ".out";
165  if (i < 20)
166  outfile_[i].open(lName.str().c_str(), std::ios::out);
167  outfileMap_[outfileNames_.at(i)] = i;
168  }
169 
170  frameQuality_.minDigiRange = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MinDigiRange", 100));
171  frameQuality_.maxDigiRange = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MaxDigiRange", 1024));
172  frameQuality_.minZeroLight = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MinZeroLight", 0));
173  frameQuality_.maxZeroLight = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MaxZeroLight", 1024));
174  frameQuality_.minTickHeight = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MinTickHeight", 0));
175  frameQuality_.maxTickHeight = static_cast<uint16_t>(iConfig.getUntrackedParameter<uint32_t>("MaxTickHeight", 1024));
176 }
T getUntrackedParameter(std::string const &, T const &) const
edm::ESGetToken< TkDetMap, TrackerTopologyRcd > tkDetMapToken_
void updateFedCabling(const SiStripFedCablingRcd &rcd)
void initialise(const edm::ParameterSet &iConfig, std::ostringstream *pDebugStream) override
std::map< std::string, unsigned int > outfileMap_
edm::EDGetTokenT< std::vector< uint32_t > > spyAPVeToken_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyPedSubtrDigisToken_
tuple nFiles
Definition: cmsBatch.py:308
sistrip::SpyUtilities::FrameQuality frameQuality_
std::vector< std::string > outfileNames_
edm::ESWatcher< SiStripFedCablingRcd > cablingWatcher_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyScopeRawDigisToken_
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_
edm::EDGetTokenT< std::vector< uint32_t > > spyL1Token_
edm::EDGetTokenT< std::vector< uint32_t > > spyTotCountToken_
SiStripSpyMonitorModule::~SiStripSpyMonitorModule ( )
override

Definition at line 178 of file SiStripSpyMonitorModule.cc.

References mps_fire::i, cmsBatch::nFiles, outfile_, outfileMap_, and outfileNames_.

178  {
179  const unsigned int nFiles = outfileNames_.size();
180  for (unsigned int i(0); i < nFiles; i++) {
181  outfile_[i].close();
182  }
183 
184  outfileMap_.clear();
185  outfileNames_.clear();
186 }
std::map< std::string, unsigned int > outfileMap_
tuple nFiles
Definition: cmsBatch.py:308
std::vector< std::string > outfileNames_

Member Function Documentation

void SiStripSpyMonitorModule::analyze ( const edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivatevirtual

Reimplemented from DQMEDAnalyzer.

Definition at line 220 of file SiStripSpyMonitorModule.cc.

References sistrip::SpyUtilities::Frame::apvAddress, sistrip::SpyUtilities::Frame::apvErrorBit, FedChannelConnection::apvPairNumber(), cablingWatcher_, edm::ESWatcher< T >::check(), FedChannelConnection::detId(), sistrip::SpyUtilities::Frame::digitalHigh, sistrip::SpyUtilities::Frame::digitalLow, alignCSCRings::e, edm::DetSetVector< T >::end(), edm::EventID::event(), evt_, sistrip::SpyUtilities::extractFrameInfo(), sistrip::FED_ID_MAX, sistrip::FED_ID_MIN, fedCabling_, sistrip::FEDCH_PER_FED, SiStripFedCabling::fedConnection(), SPYHistograms::fillCountersHistograms(), SPYHistograms::fillDetailedHistograms(), SPYHistograms::fillFEDHistograms(), fillWithLocalEvtNum_, edm::DetSetVector< T >::find(), sistrip::SpyUtilities::Frame::firstHeaderBit, firstHeaderBit_, sistrip::SpyUtilities::Frame::firstTrailerBit, firstTrailerBit_, frameQuality_, edm::Event::getByToken(), sistrip::SpyUtilities::getMajorityHeader(), SPYHistograms::Errors::hasAPVAddressError0, SPYHistograms::Errors::hasAPVAddressError1, SPYHistograms::Errors::hasErrorBit0, SPYHistograms::Errors::hasErrorBit1, SPYHistograms::Errors::hasHighPb, SPYHistograms::Errors::hasHighRange, SPYHistograms::Errors::hasLowPb, SPYHistograms::Errors::hasLowRange, SPYHistograms::Errors::hasMaxSat, SPYHistograms::Errors::hasMinZero, hasNegativePedSubtr(), SPYHistograms::Errors::hasNegPeds, SPYHistograms::Errors::hasNoData, SPYHistograms::Errors::hasOOS, SPYHistograms::Errors::hasOtherPbs, histManager_, mps_fire::i, edm::EventBase::id(), identifyTickmarks(), FedChannelConnection::isConnected(), LogDebug, sistrip::SpyUtilities::FrameQuality::maxDigiRange, sistrip::SpyUtilities::FrameQuality::maxTickHeight, sistrip::SpyUtilities::FrameQuality::maxZeroLight, sistrip::SpyUtilities::FrameQuality::minDigiRange, sistrip::SpyUtilities::FrameQuality::minTickHeight, sistrip::SpyUtilities::FrameQuality::minZeroLight, SPYHistograms::ErrorCounters::nAPVAddressError, SPYHistograms::ErrorCounters::nAPVError, cmsBatch::nFiles, SPYHistograms::ErrorCounters::nHighPb, SPYHistograms::ErrorCounters::nHighRange, SPYHistograms::ErrorCounters::nLowPb, SPYHistograms::ErrorCounters::nLowRange, SPYHistograms::ErrorCounters::nMaxSat, SPYHistograms::ErrorCounters::nMinZero, SPYHistograms::ErrorCounters::nNegPeds, SPYHistograms::ErrorCounters::nNoData, SPYHistograms::ErrorCounters::nOOS, SPYHistograms::ErrorCounters::nOtherPbs, submitPVResolutionJobs::out, outfile_, outfileMap_, outfileNames_, edm::Handle< T >::product(), sistrip::SpyUtilities::range(), sistrip::SPY_SAMPLES_PER_CHANNEL, spyAPVeToken_, spyL1Token_, spyPedSubtrDigisToken_, spyScopeRawDigisToken_, spyTotCountToken_, sistrip::STRIPS_PER_FEDCH, sistrip::SpyUtilities::threshold(), cms::Exception::what(), and writeCabling_.

220  {
221  //update cabling and pedestals
222  cablingWatcher_.check(iSetup);
223  if (evt_ == 0 && writeCabling_) {
224  std::ofstream lOutCabling;
225  lOutCabling.open("trackerDetId_FEDIdChNum_list.txt", std::ios::out);
226  for (uint16_t lFedId = sistrip::FED_ID_MIN; lFedId <= sistrip::FED_ID_MAX; ++lFedId) { //loop on feds
227  for (uint16_t lFedChannel = 0; lFedChannel < sistrip::FEDCH_PER_FED; lFedChannel++) { //loop on channels
228  const FedChannelConnection& lConnection = fedCabling_->fedConnection(lFedId, lFedChannel);
229  if (!lConnection.isConnected())
230  continue;
231  uint32_t lDetId = lConnection.detId();
232  lOutCabling << "FED ID = " << lFedId << ", Channel = " << lFedChannel
233  << ",fedkey = " << sistrip::FEDCH_PER_FED * lFedId + lFedChannel << ", detId = " << lDetId
234  << std::endl;
235  }
236  }
237  lOutCabling.close();
238  }
239 
240  //For spy data
241  //get map of TotalEventCount and L1ID, indexed by fedId, and APVaddress indexed by fedIndex.
242  edm::Handle<std::vector<uint32_t> > lSpyL1IDHandle, lSpyTotCountHandle, lSpyAPVeHandle;
243  try {
244  iEvent.getByToken(spyL1Token_, lSpyL1IDHandle);
245  iEvent.getByToken(spyTotCountToken_, lSpyTotCountHandle);
246  iEvent.getByToken(spyAPVeToken_, lSpyAPVeHandle);
247  } catch (const cms::Exception& e) {
248  LogError("SiStripSpyMonitorModule") << e.what();
249  return;
250  }
251  //const std::map<uint32_t,uint32_t> & lSpyMaxCountMap = *lSpyL1IDHandle;
252  //const std::map<uint32_t,uint32_t> & lSpyMinCountMap = *lSpyTotCountHandle;
253  const std::vector<uint32_t>& lSpyAPVeVec = *lSpyAPVeHandle;
254 
255  //retrieve the scope digis
257  try {
258  iEvent.getByToken(spyScopeRawDigisToken_, digisHandle);
259  } catch (const cms::Exception& e) {
260  LogError("SiStripSpyMonitorModule") << e.what();
261  return;
262  }
263  const edm::DetSetVector<SiStripRawDigi>* lInputDigis = digisHandle.product();
264 
265  //retrieve the reordered payload digis
267  try {
268  iEvent.getByToken(spyPedSubtrDigisToken_, payloadHandle);
269  } catch (const cms::Exception& e) {
270  LogError("SiStripSpyMonitorModule") << e.what();
271  return;
272  }
273  const edm::DetSetVector<SiStripRawDigi>* lPayloadDigis = payloadHandle.product();
274 
275  //for first event only
276  //loop first on channels to calculate majority value of when the first header bit is found.
277  //output info message to give the value found
278  //should currently be 6 but may vary in the futur
279  //then we can check firstTrailerBit is +256+24 after
280 
281  if (evt_ == 0) {
284  }
285 
286  //initialise some counters, filled in histos eventually
288  lCounters.nNoData = 0;
289  lCounters.nLowRange = 0;
290  lCounters.nHighRange = 0;
291  lCounters.nMinZero = 0;
292  lCounters.nMaxSat = 0;
293  lCounters.nLowPb = 0;
294  lCounters.nHighPb = 0;
295  lCounters.nOOS = 0;
296  lCounters.nOtherPbs = 0;
297  lCounters.nAPVError = 0;
298  lCounters.nAPVAddressError = 0;
299  lCounters.nNegPeds = 0;
300 
301  //fill event number for output text files
302  const unsigned int nFiles = outfileNames_.size();
303  for (unsigned int i(0); i < nFiles; i++) {
304  outfile_[i] << "**** evt " << iEvent.id().event() << " ****" << std::endl;
305  }
306 
307  //loop over all FEDs and channels
308 
309  for (uint16_t lFedId = sistrip::FED_ID_MIN; lFedId <= sistrip::FED_ID_MAX; ++lFedId) { //loop on feds
310 
311  SPYHistograms::Errors lFEDErrors;
312  lFEDErrors.hasNoData = false;
313  lFEDErrors.hasLowRange = false;
314  lFEDErrors.hasHighRange = false;
315  lFEDErrors.hasMinZero = false;
316  lFEDErrors.hasMaxSat = false;
317  lFEDErrors.hasLowPb = false;
318  lFEDErrors.hasHighPb = false;
319  lFEDErrors.hasOOS = false;
320  lFEDErrors.hasOtherPbs = false;
321  lFEDErrors.hasErrorBit0 = false;
322  lFEDErrors.hasErrorBit1 = false;
323  lFEDErrors.hasAPVAddressError0 = false;
324  lFEDErrors.hasAPVAddressError1 = false;
325  lFEDErrors.hasNegPeds = false;
326 
327  uint32_t lAPVAddrRef = lSpyAPVeVec.at(lFedId);
328 
329  for (uint16_t lFedChannel = 0; lFedChannel < sistrip::FEDCH_PER_FED; lFedChannel++) { //loop on channels
330 
331  uint32_t lFedIndex = sistrip::FEDCH_PER_FED * lFedId + lFedChannel;
332 
333  const FedChannelConnection& lConnection = fedCabling_->fedConnection(lFedId, lFedChannel);
334 
335  if (!lConnection.isConnected())
336  continue;
337 
338  uint32_t lDetId = lConnection.detId();
339  //uint16_t lNPairs = lConnection.nApvPairs();
340  uint16_t lPair = lConnection.apvPairNumber();
341 
342  edm::DetSetVector<SiStripRawDigi>::const_iterator lDigis = lInputDigis->find(lFedIndex);
343 
344  //pedsubtr digis
345  edm::DetSetVector<SiStripRawDigi>::const_iterator lPayload = lPayloadDigis->find(lDetId);
346 
347  //no digis found, continue.
348  if (lDigis == lInputDigis->end()) {
349  LogDebug("SiStripSpyMonitorModule") << " -- digis not found in ScopeRawDigis map for FEDID " << lFedId
350  << " and FED channel " << lFedChannel << std::endl;
351  continue;
352  }
353 
355 
356  SPYHistograms::Errors lErrors;
357  lErrors.hasNoData = false;
358  lErrors.hasLowRange = false;
359  lErrors.hasHighRange = false;
360  lErrors.hasMinZero = false;
361  lErrors.hasMaxSat = false;
362  lErrors.hasLowPb = false;
363  lErrors.hasHighPb = false;
364  lErrors.hasOOS = false;
365  lErrors.hasOtherPbs = false;
366  lErrors.hasErrorBit0 = false;
367  lErrors.hasErrorBit1 = false;
368  lErrors.hasAPVAddressError0 = false;
369  lErrors.hasAPVAddressError1 = false;
370  lErrors.hasNegPeds = false;
371 
372  uint16_t lRange = sistrip::SpyUtilities::range(lFrame);
373  uint16_t lThreshold = sistrip::SpyUtilities::threshold(lFrame);
374 
375  if (lRange == 0) {
376  lCounters.nNoData++;
377  lErrors.hasNoData = true;
378  lFEDErrors.hasNoData = true;
379  if (outfileMap_.find("NoData") != outfileMap_.end())
380  outfile_[outfileMap_["NoData"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
381  } else if (lFrame.digitalLow == 0 && lRange > 0) {
382  lCounters.nMinZero++;
383  lErrors.hasMinZero = true;
384  lFEDErrors.hasMinZero = true;
385  if (outfileMap_.find("MinZero") != outfileMap_.end())
386  outfile_[outfileMap_["MinZero"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
387  } else if (lFrame.digitalHigh >= 1023) {
388  lCounters.nMaxSat++;
389  lErrors.hasMaxSat = true;
390  lFEDErrors.hasMaxSat = true;
391  if (outfileMap_.find("MaxSat") != outfileMap_.end())
392  outfile_[outfileMap_["MaxSat"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
393  } else if (lRange > 0 && lRange < frameQuality_.minDigiRange) {
394  lCounters.nLowRange++;
395  lErrors.hasLowRange = true;
396  lFEDErrors.hasLowRange = true;
397  if (outfileMap_.find("LowRange") != outfileMap_.end())
398  outfile_[outfileMap_["LowRange"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
399  } else if (lRange > frameQuality_.maxDigiRange) {
400  lCounters.nHighRange++;
401  lErrors.hasHighRange = true;
402  lFEDErrors.hasHighRange = true;
403  if (outfileMap_.find("HighRange") != outfileMap_.end())
404  outfile_[outfileMap_["HighRange"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
405  } else if (lFrame.digitalLow < frameQuality_.minZeroLight || lFrame.digitalLow > frameQuality_.maxZeroLight) {
406  lCounters.nLowPb++;
407  lErrors.hasLowPb = true;
408  lFEDErrors.hasLowPb = true;
409  if (outfileMap_.find("LowPb") != outfileMap_.end())
410  outfile_[outfileMap_["LowPb"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
412  lCounters.nHighPb++;
413  lErrors.hasHighPb = true;
414  lFEDErrors.hasHighPb = true;
415  if (outfileMap_.find("HighPb") != outfileMap_.end())
416  outfile_[outfileMap_["HighPb"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
417  } else if (lFrame.firstHeaderBit != firstHeaderBit_ && //header in wrong position
418  ((lFrame.firstHeaderBit != sistrip::SPY_SAMPLES_PER_CHANNEL && //header and
419  lFrame.firstTrailerBit != sistrip::SPY_SAMPLES_PER_CHANNEL && //trailer found
420  lFrame.firstTrailerBit - lFrame.firstHeaderBit == 280) || //+ right distance between them
421  (lFrame.firstHeaderBit != sistrip::SPY_SAMPLES_PER_CHANNEL && // or header found
422  lFrame.firstTrailerBit == sistrip::SPY_SAMPLES_PER_CHANNEL && // and trailer not found
423  lFrame.firstHeaderBit > 16) || // corresponding to back-to-back frame late enough
424  (lFrame.firstHeaderBit == sistrip::SPY_SAMPLES_PER_CHANNEL && // or header not found
425  identifyTickmarks(*lDigis, lThreshold)) // but such that tickmark compatible with OOS frame
426  )) {
427  lCounters.nOOS++;
428  lErrors.hasOOS = true;
429  lFEDErrors.hasOOS = true;
430  if (outfileMap_.find("OOS") != outfileMap_.end())
431  outfile_[outfileMap_["OOS"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
432  } else if (!(lFrame.firstHeaderBit == firstHeaderBit_ && lFrame.firstTrailerBit == firstTrailerBit_)) {
433  lCounters.nOtherPbs++;
434  lErrors.hasOtherPbs = true;
435  lFEDErrors.hasOtherPbs = true;
436  if (outfileMap_.find("OtherPbs") != outfileMap_.end())
437  outfile_[outfileMap_["OtherPbs"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
438  } else if (lFrame.apvErrorBit.first || lFrame.apvErrorBit.second) {
439  if (lFrame.apvErrorBit.first) {
440  lCounters.nAPVError++;
441  lErrors.hasErrorBit0 = true;
442  lFEDErrors.hasErrorBit0 = true;
443  }
444  if (lFrame.apvErrorBit.second) {
445  lCounters.nAPVError++;
446  lErrors.hasErrorBit1 = true;
447  lFEDErrors.hasErrorBit1 = true;
448  }
449  if (outfileMap_.find("APVError") != outfileMap_.end()) {
450  outfile_[outfileMap_["APVError"]] << lFedId << " " << lFedChannel << " " << lDetId;
451  if (lFrame.apvErrorBit.first)
452  outfile_[outfileMap_["APVError"]] << " APV0" << std::endl;
453  if (lFrame.apvErrorBit.second)
454  outfile_[outfileMap_["APVError"]] << " APV1" << std::endl;
455  }
456  } else if (lFrame.apvAddress.first != lAPVAddrRef || lFrame.apvAddress.second != lAPVAddrRef) {
457  if (lFrame.apvAddress.first != lAPVAddrRef) {
458  lCounters.nAPVAddressError++;
459  lErrors.hasAPVAddressError0 = true;
460  lFEDErrors.hasAPVAddressError0 = true;
461  }
462  if (lFrame.apvAddress.second != lAPVAddrRef) {
463  lCounters.nAPVAddressError++;
464  lErrors.hasAPVAddressError1 = true;
465  lFEDErrors.hasAPVAddressError1 = true;
466  }
467  if (outfileMap_.find("APVAddressError") != outfileMap_.end()) {
468  outfile_[outfileMap_["APVAddressError"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
469  if (lFrame.apvAddress.first != lAPVAddrRef)
470  outfile_[outfileMap_["APVAddressError"]] << " APV0" << std::endl;
471  if (lFrame.apvAddress.second != lAPVAddrRef)
472  outfile_[outfileMap_["APVAddressError"]] << " APV1" << std::endl;
473  }
474  } else if (lPayload != lPayloadDigis->end() && hasNegativePedSubtr(*lPayload, lPair)) {
475  lCounters.nNegPeds++;
476  lErrors.hasNegPeds = true;
477  lFEDErrors.hasNegPeds = true;
478  if (outfileMap_.find("NegPeds") != outfileMap_.end())
479  outfile_[outfileMap_["NegPeds"]] << lFedId << " " << lFedChannel << " " << lDetId << std::endl;
480  }
481 
482  histManager_.fillDetailedHistograms(lErrors, lFrame, lFedId, lFedChannel);
483 
484  } //loop on channels
485 
486  histManager_.fillFEDHistograms(lFEDErrors, lFedId);
487 
488  } //loop on feds
489 
490  double lTime;
491  //if (fillWithEvtNum_)
492  //lTime = iEvent.id().event();
493  //else if (fillWithLocalEvtNum_) lTime = evt_;
494  //no orbit number for spy data !!
495  //else lTime = iEvent.orbitNumber()/11223.;
496  if (fillWithLocalEvtNum_) {
497  // casting from unsigned long long to a double here
498  // doing it explicitely
499  lTime = static_cast<double>(evt_);
500  } else {
501  // casting from unsigned long long to a double here
502  // doing it explicitely
503  lTime = static_cast<double>(iEvent.id().event());
504  }
505 
506  histManager_.fillCountersHistograms(lCounters, lTime);
507 
508  //used to fill histo vs time with local event number....
509  evt_++;
510 
511 } //analyze method
EventNumber_t event() const
Definition: EventID.h:40
std::pair< uint8_t, uint8_t > apvAddress
static const uint16_t FED_ID_MIN
iterator find(det_id_type id)
Definition: DetSetVector.h:264
FedChannelConnection fedConnection(uint16_t fed_id, uint16_t fed_ch) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
uint16_t apvPairNumber() const
bool identifyTickmarks(const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, const uint16_t threshold)
static const uint16_t SPY_SAMPLES_PER_CHANNEL
const Frame extractFrameInfo(const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, bool aPrintDebug=false)
std::map< std::string, unsigned int > outfileMap_
Log< level::Error, false > LogError
bool hasNegativePedSubtr(const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, uint16_t aPair)
edm::EDGetTokenT< std::vector< uint32_t > > spyAPVeToken_
void fillCountersHistograms(const ErrorCounters &aCounter, const double aTime)
const uint16_t threshold(const Frame &aFrame)
const uint16_t range(const Frame &aFrame)
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyPedSubtrDigisToken_
std::pair< bool, bool > apvErrorBit
const uint32_t & detId() const
tuple nFiles
Definition: cmsBatch.py:308
Class containning control, module, detector and connection information, at the level of a FED channel...
void getMajorityHeader(const edm::DetSetVector< SiStripRawDigi > *aInputDigis, uint16_t &firstHeaderBit, bool printResult=true)
sistrip::SpyUtilities::FrameQuality frameQuality_
char const * what() const noexceptoverride
Definition: Exception.cc:103
std::vector< std::string > outfileNames_
edm::ESWatcher< SiStripFedCablingRcd > cablingWatcher_
edm::EDGetTokenT< edm::DetSetVector< SiStripRawDigi > > spyScopeRawDigisToken_
iterator end()
Return the off-the-end iterator.
Definition: DetSetVector.h:325
static const uint16_t STRIPS_PER_FEDCH
T const * product() const
Definition: Handle.h:70
void fillFEDHistograms(const Errors &aErr, const unsigned int aFedId)
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
edm::EventID id() const
Definition: EventBase.h:59
static const uint16_t FEDCH_PER_FED
void fillDetailedHistograms(const Errors &aErr, const sistrip::SpyUtilities::Frame &aFrame, const unsigned int aFedId, const unsigned int aFedChannel)
static const uint16_t FED_ID_MAX
edm::EDGetTokenT< std::vector< uint32_t > > spyL1Token_
collection_type::const_iterator const_iterator
Definition: DetSetVector.h:102
const SiStripFedCabling * fedCabling_
edm::EDGetTokenT< std::vector< uint32_t > > spyTotCountToken_
#define LogDebug(id)
void SiStripSpyMonitorModule::bookHistograms ( DQMStore::IBooker ibooker,
edm::Run const &  run,
edm::EventSetup const &  eSetup 
)
overrideprivatevirtual

Implements DQMEDAnalyzer.

Definition at line 198 of file SiStripSpyMonitorModule.cc.

References SPYHistograms::bookAllFEDHistograms(), SPYHistograms::bookFEDHistograms(), SPYHistograms::bookTopLevelHistograms(), sistrip::FED_ID_MAX, sistrip::FED_ID_MIN, fillAllDetailedHistograms_, folderName_, edm::EventSetup::getData(), histManager_, dqm::implementation::NavigatorBase::pwd(), dqm::implementation::NavigatorBase::setCurrentFolder(), and tkDetMapToken_.

200  {
201  ibooker.setCurrentFolder(folderName_);
202 
203  LogInfo("SiStripSpyMonitorModule") << " Histograms will be written in " << folderName_
204  << ". Current folder is : " << ibooker.pwd() << std::endl;
205 
206  const auto tkDetMap = &eSetup.getData(tkDetMapToken_);
207  //this propagates dqm_ to the histoclass, must be called !
208  histManager_.bookTopLevelHistograms(ibooker, tkDetMap);
209 
212 
213  //dummy error object
214  SPYHistograms::Errors lError;
215  for (uint16_t lFedId = sistrip::FED_ID_MIN; lFedId <= sistrip::FED_ID_MAX; ++lFedId)
216  histManager_.bookFEDHistograms(ibooker, lFedId, lError, true);
217 }
edm::ESGetToken< TkDetMap, TrackerTopologyRcd > tkDetMapToken_
static const uint16_t FED_ID_MIN
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
virtual std::string pwd()
Definition: DQMStore.cc:16
void bookTopLevelHistograms(DQMStore::IBooker &, const TkDetMap *)
void bookAllFEDHistograms(DQMStore::IBooker &)
void bookFEDHistograms(DQMStore::IBooker &, const unsigned int fedId, const Errors &aErr, bool doAll=false)
Log< level::Info, false > LogInfo
static const uint16_t FED_ID_MAX
void SiStripSpyMonitorModule::dqmBeginRun ( const edm::Run r,
const edm::EventSetup c 
)
overrideprivatevirtual

Reimplemented from DQMEDAnalyzer.

Definition at line 192 of file SiStripSpyMonitorModule.cc.

References evt_, firstHeaderBit_, and firstTrailerBit_.

192  {
193  evt_ = 0;
194  firstHeaderBit_ = 0;
195  firstTrailerBit_ = 0;
196 }
edm::DetSetVector< SiStripRawDigi >::detset::const_iterator SiStripSpyMonitorModule::findTwoConsecutive ( const edm::DetSetVector< SiStripRawDigi >::detset &  channelDigis,
const uint16_t  threshold,
uint16_t &  aCounter 
)
private

Definition at line 558 of file SiStripSpyMonitorModule.cc.

References edm::DetSet< T >::begin(), edm::DetSet< T >::end(), sistrip::SPY_SAMPLES_PER_CHANNEL, and dtDQMClient_cfg::threshold.

Referenced by identifyTickmarks().

559  {
560  const edm::DetSetVector<SiStripRawDigi>::detset::const_iterator endChannelDigis = channelDigis.end();
561  edm::DetSetVector<SiStripRawDigi>::detset::const_iterator lStart = channelDigis.begin() + aCounter;
562 
563  bool foundTrailer = false;
564  // Loop over digis looking for last two above threshold
565  uint8_t aboveThreshold = 0;
566 
567  for (; lStart != endChannelDigis; ++lStart) {
568  if (lStart->adc() > threshold) {
569  aboveThreshold++;
570  } else {
571  aboveThreshold = 0;
572  }
573  if (aboveThreshold == 2) {
574  foundTrailer = true;
575  break;
576  }
577  aCounter++;
578  } //end of loop over digis
579 
580  if (foundTrailer)
581  return lStart;
582  else {
584  return endChannelDigis;
585  }
586 }
iterator end()
Definition: DetSet.h:58
static const uint16_t SPY_SAMPLES_PER_CHANNEL
iterator begin()
Definition: DetSet.h:57
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
bool SiStripSpyMonitorModule::hasNegativePedSubtr ( const edm::DetSetVector< SiStripRawDigi >::detset &  channelDigis,
uint16_t  aPair 
)
private

Definition at line 513 of file SiStripSpyMonitorModule.cc.

References edm::DetSet< T >::begin(), submitPVResolutionJobs::count, edm::DetSet< T >::end(), sistrip::STRIPS_PER_FEDCH, and hgcalPerformanceValidation::val.

Referenced by analyze().

514  {
516  const edm::DetSetVector<SiStripRawDigi>::detset::const_iterator endChannelDigis = channelDigis.end();
517 
518  uint32_t count = 0;
519  for (; iDigi != endChannelDigis; ++iDigi) {
520  const uint16_t val = iDigi->adc();
521  uint16_t lPair = static_cast<uint16_t>(count / sistrip::STRIPS_PER_FEDCH);
522  if (val == 0 && lPair == aPair)
523  return true;
524  count++;
525  }
526 
527  return false;
528 }
iterator end()
Definition: DetSet.h:58
iterator begin()
Definition: DetSet.h:57
static const uint16_t STRIPS_PER_FEDCH
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
bool SiStripSpyMonitorModule::identifyTickmarks ( const edm::DetSetVector< SiStripRawDigi >::detset &  channelDigis,
const uint16_t  threshold 
)
private

Definition at line 530 of file SiStripSpyMonitorModule.cc.

References submitPVResolutionJobs::count, edm::DetSet< T >::detId(), edm::DetSet< T >::end(), evt_, findTwoConsecutive(), LogDebug, and sistrip::SPY_SAMPLES_PER_CHANNEL.

Referenced by analyze().

531  {
532  //start from the end
534  uint16_t lastPos = sistrip::SPY_SAMPLES_PER_CHANNEL;
535  uint16_t nTrailers = 0;
537 
538  for (; count == 0; count--) {
539  iDigi = findTwoConsecutive(channelDigis, threshold, count);
540  //if found, in different position = 70 before than previous value, go and look 70 before
541  if (iDigi != channelDigis.end() && (lastPos == sistrip::SPY_SAMPLES_PER_CHANNEL || count == lastPos + 1 - 70)) {
542  nTrailers++;
543  lastPos = count - 1;
544  count -= 70;
545  }
546  //else keep looking
547  else
548  count--;
549  }
550 
551  if (nTrailers > 1)
552  LogDebug("SiStripSpyMonitorModule") << " -- Found " << nTrailers << " trailers every 70 clock cycles for channel "
553  << channelDigis.detId() << ", evt " << evt_ << std::endl;
554  //if only one found, should be < 280 otherwise header should have been found and this method would not be called
555  return (nTrailers > 1) || (nTrailers == 1 && lastPos < 280);
556 }
iterator end()
Definition: DetSet.h:58
edm::DetSetVector< SiStripRawDigi >::detset::const_iterator findTwoConsecutive(const edm::DetSetVector< SiStripRawDigi >::detset &channelDigis, const uint16_t threshold, uint16_t &aCounter)
det_id_type detId() const
Definition: DetSet.h:74
static const uint16_t SPY_SAMPLES_PER_CHANNEL
collection_type::const_iterator const_iterator
Definition: DetSet.h:31
#define LogDebug(id)
void SiStripSpyMonitorModule::updateFedCabling ( const SiStripFedCablingRcd rcd)
private

Definition at line 188 of file SiStripSpyMonitorModule.cc.

References fedCabling_, fedCablingToken_, and edm::eventsetup::EventSetupRecordImplementation< T >::get().

188  {
190 }
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_
const SiStripFedCabling * fedCabling_

Member Data Documentation

edm::ESWatcher<SiStripFedCablingRcd> SiStripSpyMonitorModule::cablingWatcher_
private

Definition at line 116 of file SiStripSpyMonitorModule.cc.

Referenced by analyze().

edm::EventNumber_t SiStripSpyMonitorModule::evt_
private
const SiStripFedCabling* SiStripSpyMonitorModule::fedCabling_
private

Definition at line 115 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and updateFedCabling().

edm::ESGetToken<SiStripFedCabling, SiStripFedCablingRcd> SiStripSpyMonitorModule::fedCablingToken_
private

Definition at line 114 of file SiStripSpyMonitorModule.cc.

Referenced by updateFedCabling().

bool SiStripSpyMonitorModule::fillAllDetailedHistograms_
private

Definition at line 96 of file SiStripSpyMonitorModule.cc.

Referenced by bookHistograms().

bool SiStripSpyMonitorModule::fillWithEvtNum_
private

Definition at line 98 of file SiStripSpyMonitorModule.cc.

bool SiStripSpyMonitorModule::fillWithLocalEvtNum_
private

Definition at line 99 of file SiStripSpyMonitorModule.cc.

Referenced by analyze().

uint16_t SiStripSpyMonitorModule::firstHeaderBit_
private

Definition at line 102 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and dqmBeginRun().

uint16_t SiStripSpyMonitorModule::firstTrailerBit_
private

Definition at line 103 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and dqmBeginRun().

std::string SiStripSpyMonitorModule::folderName_
private

Definition at line 94 of file SiStripSpyMonitorModule.cc.

Referenced by bookHistograms().

sistrip::SpyUtilities::FrameQuality SiStripSpyMonitorModule::frameQuality_
private

Definition at line 105 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

SPYHistograms SiStripSpyMonitorModule::histManager_
private

Definition at line 101 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), bookHistograms(), and SiStripSpyMonitorModule().

uint32_t SiStripSpyMonitorModule::maxDigiRange_
private

Definition at line 85 of file SiStripSpyMonitorModule.cc.

uint32_t SiStripSpyMonitorModule::maxDigitalHigh_
private

Definition at line 89 of file SiStripSpyMonitorModule.cc.

uint32_t SiStripSpyMonitorModule::maxDigitalLow_
private

Definition at line 87 of file SiStripSpyMonitorModule.cc.

uint32_t SiStripSpyMonitorModule::minDigiRange_
private

Definition at line 84 of file SiStripSpyMonitorModule.cc.

uint32_t SiStripSpyMonitorModule::minDigitalHigh_
private

Definition at line 88 of file SiStripSpyMonitorModule.cc.

uint32_t SiStripSpyMonitorModule::minDigitalLow_
private

Definition at line 86 of file SiStripSpyMonitorModule.cc.

std::ofstream SiStripSpyMonitorModule::outfile_[20]
private
std::map<std::string, unsigned int> SiStripSpyMonitorModule::outfileMap_
private
std::vector<std::string> SiStripSpyMonitorModule::outfileNames_
private
edm::InputTag SiStripSpyMonitorModule::spyAPVeTag_
private

Definition at line 78 of file SiStripSpyMonitorModule.cc.

Referenced by SiStripSpyMonitorModule().

edm::EDGetTokenT<std::vector<uint32_t> > SiStripSpyMonitorModule::spyAPVeToken_
private

Definition at line 82 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

edm::InputTag SiStripSpyMonitorModule::spyL1Tag_
private

Definition at line 76 of file SiStripSpyMonitorModule.cc.

Referenced by SiStripSpyMonitorModule().

edm::EDGetTokenT<std::vector<uint32_t> > SiStripSpyMonitorModule::spyL1Token_
private

Definition at line 80 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

edm::InputTag SiStripSpyMonitorModule::spyPedSubtrDigisTag_
private

Definition at line 70 of file SiStripSpyMonitorModule.cc.

Referenced by SiStripSpyMonitorModule().

edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > SiStripSpyMonitorModule::spyPedSubtrDigisToken_
private

Definition at line 73 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

edm::InputTag SiStripSpyMonitorModule::spyScopeRawDigisTag_
private

Definition at line 69 of file SiStripSpyMonitorModule.cc.

Referenced by SiStripSpyMonitorModule().

edm::EDGetTokenT<edm::DetSetVector<SiStripRawDigi> > SiStripSpyMonitorModule::spyScopeRawDigisToken_
private

Definition at line 72 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

edm::InputTag SiStripSpyMonitorModule::spyTotCountTag_
private

Definition at line 77 of file SiStripSpyMonitorModule.cc.

Referenced by SiStripSpyMonitorModule().

edm::EDGetTokenT<std::vector<uint32_t> > SiStripSpyMonitorModule::spyTotCountToken_
private

Definition at line 81 of file SiStripSpyMonitorModule.cc.

Referenced by analyze(), and SiStripSpyMonitorModule().

edm::ESGetToken<TkDetMap, TrackerTopologyRcd> SiStripSpyMonitorModule::tkDetMapToken_
private

Definition at line 113 of file SiStripSpyMonitorModule.cc.

Referenced by bookHistograms().

bool SiStripSpyMonitorModule::writeCabling_
private

Definition at line 111 of file SiStripSpyMonitorModule.cc.

Referenced by analyze().