CMS 3D CMS Logo

SiPixelRawDataErrorSource.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelMonitorRawData
4 // Class: SiPixelRawDataErrorSource
5 //
22 //
23 // Original Author: Andrew York
24 //
26 // Framework
30 // DQM Framework
34 
35 // Geometry
38 // DataFormats
46 //
47 #include <cstdlib>
48 #include <string>
49 
50 using namespace std;
51 using namespace edm;
52 
54  : conf_(iConfig),
55  src_(consumes<DetSetVector<SiPixelRawDataError>>(conf_.getParameter<edm::InputTag>("src"))),
56  saveFile(conf_.getUntrackedParameter<bool>("saveFile", false)),
57  isPIB(conf_.getUntrackedParameter<bool>("isPIB", false)),
58  slowDown(conf_.getUntrackedParameter<bool>("slowDown", false)),
59  reducedSet(conf_.getUntrackedParameter<bool>("reducedSet", false)),
60  modOn(conf_.getUntrackedParameter<bool>("modOn", true)),
61  ladOn(conf_.getUntrackedParameter<bool>("ladOn", false)),
62  bladeOn(conf_.getUntrackedParameter<bool>("bladeOn", false)),
63  isUpgrade(conf_.getUntrackedParameter<bool>("isUpgrade", false)) {
64  firstRun = true;
65  LogInfo("PixelDQM") << "SiPixelRawDataErrorSource::SiPixelRawDataErrorSource:"
66  " Got DQM BackEnd interface"
67  << endl;
68  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
69  inputSourceToken_ = consumes<FEDRawDataCollection>(conf_.getUntrackedParameter<string>("inputSource", "source"));
70  trackerTopoTokenBeginRun_ = esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>();
71  trackerGeomTokenBeginRun_ = esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, edm::Transition::BeginRun>();
72 }
73 
75  // do anything here that needs to be done at desctruction time
76  // (e.g. close files, deallocate resources etc.)
77  LogInfo("PixelDQM") << "SiPixelRawDataErrorSource::~SiPixelRawDataErrorSource: Destructor" << endl;
78 }
79 
81  LogInfo("PixelDQM") << " SiPixelRawDataErrorSource::beginRun - Initialisation ... " << std::endl;
82  LogInfo("PixelDQM") << "Mod/Lad/Blade " << modOn << "/" << ladOn << "/" << bladeOn << std::endl;
83 
84  if (firstRun) {
85  eventNo = 0;
86 
87  firstRun = false;
88  }
89 
90  // Build map
91  buildStructure(iSetup);
92 }
93 
95  edm::Run const &,
96  edm::EventSetup const &iSetup) {
97  // Book Monitoring Elements
98  bookMEs(iBooker);
99 }
100 
101 //------------------------------------------------------------------
102 // Method called for every event
103 //------------------------------------------------------------------
105  eventNo++;
106  // check feds in readout
107  if (eventNo == 1) {
108  // check if any Pixel FED is in readout:
109  edm::Handle<FEDRawDataCollection> rawDataHandle;
110  iEvent.getByToken(inputSourceToken_, rawDataHandle);
111  if (!rawDataHandle.isValid()) {
112  edm::LogInfo("SiPixelRawDataErrorSource") << "inputsource is empty";
113  } else {
114  const FEDRawDataCollection &rawDataCollection = *rawDataHandle;
115  for (int i = 0; i != 40; i++) {
116  if (rawDataCollection.FEDData(i).size() && rawDataCollection.FEDData(i).data())
117  fedcounter->setBinContent(i + 1, 1);
118  }
119  }
120  }
121  // get input data
123  iEvent.getByToken(src_, input);
124  if (!input.isValid())
125  return;
126 
127  int lumiSection = (int)iEvent.luminosityBlock();
128 
129  int nEventBPIXModuleErrors = 0;
130  int nEventFPIXModuleErrors = 0;
131  int nEventBPIXFEDErrors = 0;
132  int nEventFPIXFEDErrors = 0;
133  int nErrors = 0;
134 
135  std::map<uint32_t, SiPixelRawDataErrorModule *>::iterator struct_iter;
136  std::map<uint32_t, SiPixelRawDataErrorModule *>::iterator struct_iter2;
137  for (struct_iter = thePixelStructure.begin(); struct_iter != thePixelStructure.end(); struct_iter++) {
138  int numberOfModuleErrors = (*struct_iter).second->fill(*input, &meMapFEDs_, modOn, ladOn, bladeOn);
139  if (DetId((*struct_iter).first).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel))
140  nEventBPIXModuleErrors = nEventBPIXModuleErrors + numberOfModuleErrors;
141  if (DetId((*struct_iter).first).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap))
142  nEventFPIXModuleErrors = nEventFPIXModuleErrors + numberOfModuleErrors;
143  // cout<<"NErrors: "<<nEventBPIXModuleErrors<<"
144  // "<<nEventFPIXModuleErrors<<endl;
145  nErrors = nErrors + numberOfModuleErrors;
146  // if(nErrors>0) cout<<"MODULES: nErrors: "<<nErrors<<endl;
147  }
148  for (struct_iter2 = theFEDStructure.begin(); struct_iter2 != theFEDStructure.end(); struct_iter2++) {
149  int numberOfFEDErrors = (*struct_iter2).second->fillFED(*input, &meMapFEDs_);
150  if ((*struct_iter2).first <= 31)
151  nEventBPIXFEDErrors = nEventBPIXFEDErrors + numberOfFEDErrors; // (*struct_iter2).first >= 0, since
152  // (*struct_iter2).first is unsigned
153  if ((*struct_iter2).first >= 32 && (*struct_iter2).first <= 39)
154  nEventFPIXFEDErrors = nEventFPIXFEDErrors + numberOfFEDErrors;
155  // cout<<"NFEDErrors: "<<nEventBPIXFEDErrors<<"
156  // "<<nEventFPIXFEDErrors<<endl;
157  nErrors = nErrors + numberOfFEDErrors;
158  // if(nErrors>0) cout<<"FEDS: nErrors: "<<nErrors<<endl;
159  }
160  if (byLumiErrors) {
162  // cout<<"NErrors: "<<nEventBPIXModuleErrors<<" "<<nEventFPIXModuleErrors<<"
163  // "<<nEventBPIXFEDErrors<<" "<<nEventFPIXFEDErrors<<endl;
164  if (nEventBPIXModuleErrors + nEventBPIXFEDErrors > 0)
165  byLumiErrors->Fill(0, 1.);
166  if (nEventFPIXModuleErrors + nEventFPIXFEDErrors > 0)
167  byLumiErrors->Fill(1, 1.);
168  // cout<<"histo: "<<byLumiErrors->getBinContent(0)<<"
169  // "<<byLumiErrors->getBinContent(1)<<"
170  // "<<byLumiErrors->getBinContent(2)<<endl;
171  }
172 
173  // Rate of errors per lumi section:
174  if (errorRate)
175  errorRate->Fill(lumiSection, nErrors);
176 
177  // slow down...
178  if (slowDown)
179  usleep(100000);
180 }
181 
182 //------------------------------------------------------------------
183 // Build data structure
184 //------------------------------------------------------------------
186  LogInfo("PixelDQM") << " SiPixelRawDataErrorSource::buildStructure";
187 
189 
191  const TrackerTopology *pTT = tTopoHandle.product();
192 
193  LogVerbatim("PixelDQM") << " *** Geometry node for TrackerGeom is " << &(*pDD) << std::endl;
194  LogVerbatim("PixelDQM") << " *** I have " << pDD->detsPXB().size() << " barrel pixel detectors" << std::endl;
195  LogVerbatim("PixelDQM") << " *** I have " << pDD->detsPXF().size() << " endcap pixel detectors" << std::endl;
196  // LogVerbatim ("PixelDQM") << " *** I have " << pDD->detTypes().size() <<"
197  // types"<<std::endl;
198 
199  for (TrackerGeometry::DetContainer::const_iterator it = pDD->detsPXB().begin(); it != pDD->detsPXB().end(); it++) {
200  const GeomDetUnit *geoUnit = dynamic_cast<const GeomDetUnit *>(*it);
201  // check if it is a detUnit
202  if (geoUnit == nullptr)
203  LogError("PixelDQM") << "Pixel GeomDet is not a GeomDetUnit!" << std::endl;
204  const PixelGeomDetUnit *pixDet = dynamic_cast<const PixelGeomDetUnit *>(geoUnit);
205  int nrows = (pixDet->specificTopology()).nrows();
206  int ncols = (pixDet->specificTopology()).ncolumns();
207 
208  if (isPIB)
209  continue;
210  DetId detId = (*it)->geographicalId();
211  LogDebug("PixelDQM") << " ---> Adding Barrel Module " << detId.rawId() << endl;
212  uint32_t id = detId();
213  SiPixelRawDataErrorModule *theModule = new SiPixelRawDataErrorModule(id, ncols, nrows);
214  thePixelStructure.insert(pair<uint32_t, SiPixelRawDataErrorModule *>(id, theModule));
215  }
216 
217  for (TrackerGeometry::DetContainer::const_iterator it = pDD->detsPXF().begin(); it != pDD->detsPXF().end(); it++) {
218  const GeomDetUnit *geoUnit = dynamic_cast<const GeomDetUnit *>(*it);
219  // check if it is a detUnit
220  if (geoUnit == nullptr)
221  LogError("PixelDQM") << "Pixel GeomDet is not a GeomDetUnit!" << std::endl;
222  const PixelGeomDetUnit *pixDet = dynamic_cast<const PixelGeomDetUnit *>(geoUnit);
223  int nrows = (pixDet->specificTopology()).nrows();
224  int ncols = (pixDet->specificTopology()).ncolumns();
225 
226  DetId detId = (*it)->geographicalId();
227  LogDebug("PixelDQM") << " ---> Adding Endcap Module " << detId.rawId() << endl;
228  uint32_t id = detId();
229  SiPixelRawDataErrorModule *theModule = new SiPixelRawDataErrorModule(id, ncols, nrows);
230 
232  int disk = PixelEndcapName(DetId(id), pTT, isUpgrade).diskName();
233  int blade = PixelEndcapName(DetId(id), pTT, isUpgrade).bladeName();
234  int panel = PixelEndcapName(DetId(id), pTT, isUpgrade).pannelName();
236 
237  char sside[80];
238  sprintf(sside, "HalfCylinder_%i", side);
239  char sdisk[80];
240  sprintf(sdisk, "Disk_%i", disk);
241  char sblade[80];
242  sprintf(sblade, "Blade_%02i", blade);
243  char spanel[80];
244  sprintf(spanel, "Panel_%i", panel);
245  char smodule[80];
246  sprintf(smodule, "Module_%i", module);
247  std::string side_str = sside;
248  std::string disk_str = sdisk;
249  bool mask = side_str.find("HalfCylinder_1") != string::npos || side_str.find("HalfCylinder_2") != string::npos ||
250  side_str.find("HalfCylinder_4") != string::npos || disk_str.find("Disk_2") != string::npos;
251  // clutch to take all of FPIX, but no BPIX:
252  mask = false;
253  if (isPIB && mask)
254  continue;
255 
256  thePixelStructure.insert(pair<uint32_t, SiPixelRawDataErrorModule *>(id, theModule));
257  }
258 
259  LogDebug("PixelDQM") << " ---> Adding Module for Additional Errors " << endl;
261 
262  fedIds.first = 0;
263  fedIds.second = 39;
264 
265  for (int fedId = fedIds.first; fedId <= fedIds.second; fedId++) {
266  // std::cout<<"Adding FED module: "<<fedId<<std::endl;
267  uint32_t id = static_cast<uint32_t>(fedId);
269  theFEDStructure.insert(pair<uint32_t, SiPixelRawDataErrorModule *>(id, theModule));
270  }
271 
272  LogInfo("PixelDQM") << " *** Pixel Structure Size " << thePixelStructure.size() << endl;
273 }
274 //------------------------------------------------------------------
275 // Book MEs
276 //------------------------------------------------------------------
278  iBooker.setCurrentFolder(topFolderName_ + "/EventInfo/DAQContents");
279  char title0[80];
280  sprintf(title0, "FED isPresent;FED ID;isPresent");
281  fedcounter = iBooker.book1D("fedcounter", title0, 40, -0.5, 39.5);
282  iBooker.setCurrentFolder(topFolderName_ + "/AdditionalPixelErrors");
283  char title[80];
284  sprintf(title, "By-LumiSection Error counters");
285  {
286  auto scope = DQMStore::IBooker::UseLumiScope(iBooker);
287  byLumiErrors = iBooker.book1D("byLumiErrors", title, 2, 0., 2.);
288  }
289  char title1[80];
290  sprintf(title1, "Errors per LumiSection;LumiSection;NErrors");
291  errorRate = iBooker.book1D("errorRate", title1, 5000, 0., 5000.);
292 
293  std::map<uint32_t, SiPixelRawDataErrorModule *>::iterator struct_iter;
294  std::map<uint32_t, SiPixelRawDataErrorModule *>::iterator struct_iter2;
295 
296  SiPixelFolderOrganizer theSiPixelFolder(false);
297 
298  for (struct_iter = thePixelStructure.begin(); struct_iter != thePixelStructure.end(); struct_iter++) {
300 
301  if (modOn) {
302  if (!theSiPixelFolder.setModuleFolder(iBooker, (*struct_iter).first, 0, isUpgrade)) {
303  // std::cout<<"PIB! not booking histograms for non-PIB
304  // modules!"<<std::endl;
305  if (!isPIB)
306  throw cms::Exception("LogicError") << "[SiPixelRawDataErrorSource::bookMEs] Creation of DQM folder "
307  "failed";
308  }
309  }
310 
311  if (ladOn) {
312  if (!theSiPixelFolder.setModuleFolder(iBooker, (*struct_iter).first, 1, isUpgrade)) {
313  LogDebug("PixelDQM") << "PROBLEM WITH LADDER-FOLDER\n";
314  }
315  }
316 
317  if (bladeOn) {
318  if (!theSiPixelFolder.setModuleFolder(iBooker, (*struct_iter).first, 4, isUpgrade)) {
319  LogDebug("PixelDQM") << "PROBLEM WITH BLADE-FOLDER\n";
320  }
321  }
322 
323  } // for loop
324 
325  for (struct_iter2 = theFEDStructure.begin(); struct_iter2 != theFEDStructure.end(); struct_iter2++) {
327  if (!theSiPixelFolder.setFedFolder(iBooker, (*struct_iter2).first)) {
328  throw cms::Exception("LogicError") << "[SiPixelRawDataErrorSource::bookMEs] Creation of DQM folder "
329  "failed";
330  }
331  }
332 
333  // Booking FED histograms
334  std::string hid;
335  // Get collection name and instantiate Histo Id builder
337  SiPixelHistogramId *theHistogramId = new SiPixelHistogramId(src.label());
338 
339  for (uint32_t id = 0; id < 40; id++) {
340  char temp[50];
341  sprintf(temp, (topFolderName_ + "/AdditionalPixelErrors/FED_%d").c_str(), id);
342  iBooker.cd(temp);
343  // Types of errors
344  hid = theHistogramId->setHistoId("errorType", id);
345  meErrorType_[id] = iBooker.book1D(hid, "Type of errors", 15, 24.5, 39.5);
346  meErrorType_[id]->setAxisTitle("Type of errors", 1);
347  // Number of errors
348  hid = theHistogramId->setHistoId("NErrors", id);
349  meNErrors_[id] = iBooker.book1D(hid, "Number of errors", 36, 0., 36.);
350  meNErrors_[id]->setAxisTitle("Number of errors", 1);
351  // Type of FIFO full (errorType = 28). FIFO 1 is 1-5 (where fullType =
352  // channel of FIFO 1), fullType = 6 signifies FIFO 2 nearly full, 7
353  // signifies trigger FIFO nearly full, 8 indicates an unexpected result
354  hid = theHistogramId->setHistoId("fullType", id);
355  meFullType_[id] = iBooker.book1D(hid, "Type of FIFO full", 7, 0.5, 7.5);
356  meFullType_[id]->setAxisTitle("FIFO type", 1);
357  // For error type 30, the type of problem encoded in the TBM trailer
358  // 0 = stack full, 1 = Pre-cal issued, 2 = clear trigger counter, 3 = sync
359  // trigger, 4 = sync trigger error, 5 = reset ROC, 6 = reset TBM, 7 = no
360  // token bit pass
361  hid = theHistogramId->setHistoId("TBMMessage", id);
362  meTBMMessage_[id] = iBooker.book1D(hid, "TBM trailer message", 8, -0.5, 7.5);
363  meTBMMessage_[id]->setAxisTitle("TBM message", 1);
364  // For error type 30, the type of problem encoded in the TBM error trailer 0
365  // = none 1 = data stream too long, 2 = FSM errors, 3 = invalid # of ROCs, 4
366  // = multiple
367  hid = theHistogramId->setHistoId("TBMType", id);
368  meTBMType_[id] = iBooker.book1D(hid, "Type of TBM trailer", 5, -0.5, 4.5);
369  meTBMType_[id]->setAxisTitle("TBM Type", 1);
370  // For error type 31, the event number of the TBM header with the error
371  hid = theHistogramId->setHistoId("EvtNbr", id);
372  meEvtNbr_[id] = iBooker.book1D(hid, "Event number", 1, 0, 1);
373  // For errorType = 34, datastream size according to error word
374  hid = theHistogramId->setHistoId("evtSize", id);
375  meEvtSize_[id] = iBooker.book1D(hid, "Event size", 1, 0, 1);
376  //
377  hid = theHistogramId->setHistoId("FedChNErr", id);
378  meFedChNErr_[id] = iBooker.book1D(hid, "Number of errors per FED channel", 37, 0, 37);
379  meFedChNErr_[id]->setAxisTitle("FED channel", 1);
380  //
381  hid = theHistogramId->setHistoId("FedChLErr", id);
382  meFedChLErr_[id] = iBooker.book1D(hid, "Last error per FED channel", 37, 0, 37);
383  meFedChLErr_[id]->setAxisTitle("FED channel", 1);
384  //
385  hid = theHistogramId->setHistoId("FedETypeNErr", id);
386  meFedETypeNErr_[id] = iBooker.book1D(hid, "Number of errors per type", 21, 0, 21);
387  meFedETypeNErr_[id]->setAxisTitle("Error type", 1);
388  }
389  // Add the booked histograms to the histogram map for booking
390  meMapFEDs_["meErrorType_"] = meErrorType_;
391  meMapFEDs_["meNErrors_"] = meNErrors_;
392  meMapFEDs_["meFullType_"] = meFullType_;
393  meMapFEDs_["meTBMMessage_"] = meTBMMessage_;
394  meMapFEDs_["meTBMType_"] = meTBMType_;
395  meMapFEDs_["meEvtNbr_"] = meEvtNbr_;
396  meMapFEDs_["meEvtSize_"] = meEvtSize_;
397  meMapFEDs_["meFedChNErr_"] = meFedChNErr_;
398  meMapFEDs_["meFedChLErr_"] = meFedChLErr_;
399  meMapFEDs_["meFedETypeNErr_"] = meFedETypeNErr_;
400 
401  // cout<<"...leaving SiPixelRawDataErrorSource::bookMEs now! "<<endl;
402 }
403 
Log< level::Info, true > LogVerbatim
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
virtual void bookMEs(DQMStore::IBooker &)
edm::EDGetTokenT< edm::DetSetVector< SiPixelRawDataError > > src_
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const DetContainer & detsPXB() const
int bladeName() const
blade id
MonitorElement * meFedETypeNErr_[40]
const DetContainer & detsPXF() const
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > trackerGeomTokenBeginRun_
Log< level::Error, false > LogError
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
constexpr uint32_t mask
Definition: gpuClustering.h:24
static std::string const input
Definition: EdmProvDump.cc:50
T getUntrackedParameter(std::string const &, T const &) const
void Fill(long long x)
bool setFedFolder(const uint32_t FedId)
Set folder name for a FED (used in the case of errors without detId)
int iEvent
Definition: GenABIO.cc:224
T const * product() const
Definition: ESHandle.h:86
std::map< uint32_t, SiPixelRawDataErrorModule * > theFEDStructure
int diskName() const
disk id
bool setModuleFolder(const uint32_t &rawdetid=0, int type=0, bool isUpgrade=false)
Set folder name for a module or plaquette.
HalfCylinder halfCylinder() const
void dqmBeginRun(const edm::Run &, edm::EventSetup const &) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:48
UseScope< MonitorElementData::Scope::LUMI > UseLumiScope
Definition: DQMStore.h:540
SiPixelRawDataErrorSource(const edm::ParameterSet &conf)
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
Log< level::Info, false > LogInfo
Definition: DetId.h:17
std::map< uint32_t, SiPixelRawDataErrorModule * > thePixelStructure
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
edm::EDGetTokenT< FEDRawDataCollection > inputSourceToken_
bool isValid() const
Definition: HandleBase.h:70
virtual void buildStructure(edm::EventSetup const &)
HLT enums.
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
void analyze(const edm::Event &, const edm::EventSetup &) override
std::map< std::string, MonitorElement ** > meMapFEDs_
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
modOn
online/offline RawDataErrors
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > trackerTopoTokenBeginRun_
int pannelName() const
pannel id
Pixel error – collection of errors and error information.
Definition: Run.h:45
#define LogDebug(id)
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
int plaquetteName() const
plaquetteId (in pannel)