CMS 3D CMS Logo

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