CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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
38 // DataFormats
46 //
47 #include <string>
48 #include <stdlib.h>
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 {
65  firstRun = true;
66  LogInfo ("PixelDQM") << "SiPixelRawDataErrorSource::SiPixelRawDataErrorSource: Got DQM BackEnd interface"<<endl;
67  inputSourceToken_ = consumes<FEDRawDataCollection>(conf_.getUntrackedParameter<string>("inputSource", "source"));
68 }
69 
70 
72 {
73  // do anything here that needs to be done at desctruction time
74  // (e.g. close files, deallocate resources etc.)
75  LogInfo ("PixelDQM") << "SiPixelRawDataErrorSource::~SiPixelRawDataErrorSource: Destructor"<<endl;
76 }
77 
79 
80  LogInfo ("PixelDQM") << " SiPixelRawDataErrorSource::beginRun - Initialisation ... " << std::endl;
81  LogInfo ("PixelDQM") << "Mod/Lad/Blade " << modOn << "/" << ladOn << "/" << bladeOn << std::endl;
82 
83  if(firstRun){
84  eventNo = 0;
85 
86  firstRun = false;
87  }
88 
89  // Build map
90  buildStructure(iSetup);
91 }
92 
94  // Book Monitoring Elements
95  bookMEs(iBooker);
96 }
97 
98 //------------------------------------------------------------------
99 // Method called for every event
100 //------------------------------------------------------------------
102 {
103  eventNo++;
104  //check feds in readout
105  if(eventNo==1){
106  // check if any Pixel FED is in readout:
107  edm::Handle<FEDRawDataCollection> rawDataHandle;
108  iEvent.getByToken(inputSourceToken_, rawDataHandle);
109  if(!rawDataHandle.isValid()){
110  std::cout << "inputsource is empty" << std::endl;
111  edm::LogInfo("SiPixelRawDataErrorSource") << "inputsource is empty";
112  }
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()) fedcounter->setBinContent(i+1,1);
117  }
118  }
119  }
120  // get input data
122  iEvent.getByToken( src_, input );
123  if (!input.isValid()) return;
124 
125  int lumiSection = (int)iEvent.luminosityBlock();
126 
127  int nEventBPIXModuleErrors = 0; int nEventFPIXModuleErrors = 0; int nEventBPIXFEDErrors = 0; int nEventFPIXFEDErrors = 0;
128  int nErrors = 0;
129 
130  std::map<uint32_t,SiPixelRawDataErrorModule*>::iterator struct_iter;
131  std::map<uint32_t,SiPixelRawDataErrorModule*>::iterator struct_iter2;
132  for (struct_iter = thePixelStructure.begin() ; struct_iter != thePixelStructure.end() ; struct_iter++) {
133 
134  int numberOfModuleErrors = (*struct_iter).second->fill(*input, &meMapFEDs_, modOn, ladOn, bladeOn);
135  if(DetId( (*struct_iter).first ).subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel)) nEventBPIXModuleErrors = nEventBPIXModuleErrors + numberOfModuleErrors;
136  if(DetId( (*struct_iter).first ).subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap)) nEventFPIXModuleErrors = nEventFPIXModuleErrors + numberOfModuleErrors;
137  //cout<<"NErrors: "<<nEventBPIXModuleErrors<<" "<<nEventFPIXModuleErrors<<endl;
138  nErrors = nErrors + numberOfModuleErrors;
139  //if(nErrors>0) cout<<"MODULES: nErrors: "<<nErrors<<endl;
140  }
141  for (struct_iter2 = theFEDStructure.begin() ; struct_iter2 != theFEDStructure.end() ; struct_iter2++) {
142 
143  int numberOfFEDErrors = (*struct_iter2).second->fillFED(*input, &meMapFEDs_);
144  if((*struct_iter2).first <= 31) nEventBPIXFEDErrors = nEventBPIXFEDErrors + numberOfFEDErrors; // (*struct_iter2).first >= 0, since (*struct_iter2).first is unsigned
145  if((*struct_iter2).first >= 32 && (*struct_iter2).first <= 39) nEventFPIXFEDErrors = nEventFPIXFEDErrors + numberOfFEDErrors;
146  //cout<<"NFEDErrors: "<<nEventBPIXFEDErrors<<" "<<nEventFPIXFEDErrors<<endl;
147  nErrors = nErrors + numberOfFEDErrors;
148  //if(nErrors>0) cout<<"FEDS: nErrors: "<<nErrors<<endl;
149  }
150  if(byLumiErrors){
152  //cout<<"NErrors: "<<nEventBPIXModuleErrors<<" "<<nEventFPIXModuleErrors<<" "<<nEventBPIXFEDErrors<<" "<<nEventFPIXFEDErrors<<endl;
153  if(nEventBPIXModuleErrors+nEventBPIXFEDErrors>0) byLumiErrors->Fill(0,1.);
154  if(nEventFPIXModuleErrors+nEventFPIXFEDErrors>0) byLumiErrors->Fill(1,1.);
155  //cout<<"histo: "<<byLumiErrors->getBinContent(0)<<" "<<byLumiErrors->getBinContent(1)<<" "<<byLumiErrors->getBinContent(2)<<endl;
156  }
157 
158  // Rate of errors per lumi section:
159  if(errorRate) errorRate->Fill(lumiSection, nErrors);
160 
161  // slow down...
162  if(slowDown) usleep(100000);
163 
164 }
165 
166 //------------------------------------------------------------------
167 // Build data structure
168 //------------------------------------------------------------------
170 
171  LogInfo ("PixelDQM") <<" SiPixelRawDataErrorSource::buildStructure" ;
173  iSetup.get<TrackerDigiGeometryRecord>().get( pDD );
174 
175  LogVerbatim ("PixelDQM") << " *** Geometry node for TrackerGeom is "<<&(*pDD)<<std::endl;
176  LogVerbatim ("PixelDQM") << " *** I have " << pDD->dets().size() <<" detectors"<<std::endl;
177  LogVerbatim ("PixelDQM") << " *** I have " << pDD->detTypes().size() <<" types"<<std::endl;
178 
179  for(TrackerGeometry::DetContainer::const_iterator it = pDD->dets().begin(); it != pDD->dets().end(); it++){
180 
181  if( ((*it)->subDetector()==GeomDetEnumerators::PixelBarrel) || ((*it)->subDetector()==GeomDetEnumerators::PixelEndcap) ){
182  DetId detId = (*it)->geographicalId();
183  const GeomDetUnit * geoUnit = pDD->idToDetUnit( detId );
184  const PixelGeomDetUnit * pixDet = dynamic_cast<const PixelGeomDetUnit*>(geoUnit);
185  int nrows = (pixDet->specificTopology()).nrows();
186  int ncols = (pixDet->specificTopology()).ncolumns();
187 
188  if(detId.subdetId() == static_cast<int>(PixelSubdetector::PixelBarrel)) {
189  if(isPIB) continue;
190  LogDebug ("PixelDQM") << " ---> Adding Barrel Module " << detId.rawId() << endl;
191  uint32_t id = detId();
192  SiPixelRawDataErrorModule* theModule = new SiPixelRawDataErrorModule(id, ncols, nrows);
193  thePixelStructure.insert(pair<uint32_t,SiPixelRawDataErrorModule*> (id,theModule));
194 
195  } else if( (detId.subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap)) && (!isUpgrade)) {
196  LogDebug ("PixelDQM") << " ---> Adding Endcap Module " << detId.rawId() << endl;
197  uint32_t id = detId();
198  SiPixelRawDataErrorModule* theModule = new SiPixelRawDataErrorModule(id, ncols, nrows);
199 
201  int disk = PixelEndcapName(DetId(id)).diskName();
202  int blade = PixelEndcapName(DetId(id)).bladeName();
203  int panel = PixelEndcapName(DetId(id)).pannelName();
205 
206  char sside[80]; sprintf(sside, "HalfCylinder_%i",side);
207  char sdisk[80]; sprintf(sdisk, "Disk_%i",disk);
208  char sblade[80]; sprintf(sblade, "Blade_%02i",blade);
209  char spanel[80]; sprintf(spanel, "Panel_%i",panel);
210  char smodule[80];sprintf(smodule,"Module_%i",module);
211  std::string side_str = sside;
212  std::string disk_str = sdisk;
213  bool mask = side_str.find("HalfCylinder_1")!=string::npos||
214  side_str.find("HalfCylinder_2")!=string::npos||
215  side_str.find("HalfCylinder_4")!=string::npos||
216  disk_str.find("Disk_2")!=string::npos;
217  // clutch to take all of FPIX, but no BPIX:
218  mask = false;
219  if(isPIB && mask) continue;
220 
221  thePixelStructure.insert(pair<uint32_t,SiPixelRawDataErrorModule*> (id,theModule));
222  } else if( (detId.subdetId() == static_cast<int>(PixelSubdetector::PixelEndcap)) && (isUpgrade)) {
223  LogDebug ("PixelDQM") << " ---> Adding Endcap Module " << detId.rawId() << endl;
224  uint32_t id = detId();
225  SiPixelRawDataErrorModule* theModule = new SiPixelRawDataErrorModule(id, ncols, nrows);
226 
228  int disk = PixelEndcapNameUpgrade(DetId(id)).diskName();
229  int blade = PixelEndcapNameUpgrade(DetId(id)).bladeName();
230  int panel = PixelEndcapNameUpgrade(DetId(id)).pannelName();
232 
233  char sside[80]; sprintf(sside, "HalfCylinder_%i",side);
234  char sdisk[80]; sprintf(sdisk, "Disk_%i",disk);
235  char sblade[80]; sprintf(sblade, "Blade_%02i",blade);
236  char spanel[80]; sprintf(spanel, "Panel_%i",panel);
237  char smodule[80];sprintf(smodule,"Module_%i",module);
238  std::string side_str = sside;
239  std::string disk_str = sdisk;
240  bool mask = side_str.find("HalfCylinder_1")!=string::npos||
241  side_str.find("HalfCylinder_2")!=string::npos||
242  side_str.find("HalfCylinder_4")!=string::npos||
243  disk_str.find("Disk_2")!=string::npos;
244  // clutch to take all of FPIX, but no BPIX:
245  mask = false;
246  if(isPIB && mask) continue;
247 
248  thePixelStructure.insert(pair<uint32_t,SiPixelRawDataErrorModule*> (id,theModule));
249  }//endif(isUpgrade)
250  }
251  }
252  LogDebug ("PixelDQM") << " ---> Adding Module for Additional Errors " << endl;
254  fedIds.first = 0;
255  fedIds.second = 39;
256  for (int fedId = fedIds.first; fedId <= fedIds.second; fedId++) {
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  LogInfo ("PixelDQM") << " *** Pixel Structure Size " << thePixelStructure.size() << endl;
264 }
265 //------------------------------------------------------------------
266 // Book MEs
267 //------------------------------------------------------------------
269  iBooker.setCurrentFolder("Pixel/EventInfo/DAQContents");
270  char title0[80]; sprintf(title0, "FED isPresent;FED ID;isPresent");
271  fedcounter = iBooker.book1D("fedcounter",title0,40,-0.5,39.5);
272  iBooker.setCurrentFolder("Pixel/AdditionalPixelErrors");
273  char title[80]; sprintf(title, "By-LumiSection Error counters");
274  byLumiErrors = iBooker.book1D("byLumiErrors",title,2,0.,2.);
276  char title1[80]; sprintf(title1, "Errors per LumiSection;LumiSection;NErrors");
277  errorRate = iBooker.book1D("errorRate",title1,5000,0.,5000.);
278 
279  std::map<uint32_t,SiPixelRawDataErrorModule*>::iterator struct_iter;
280  std::map<uint32_t,SiPixelRawDataErrorModule*>::iterator struct_iter2;
281 
282  SiPixelFolderOrganizer theSiPixelFolder(false);
283 
284  for(struct_iter = thePixelStructure.begin(); struct_iter != thePixelStructure.end(); struct_iter++){
286 
287  if(modOn){
288  if(!theSiPixelFolder.setModuleFolder(iBooker,(*struct_iter).first,0,isUpgrade)) {
289  //std::cout<<"PIB! not booking histograms for non-PIB modules!"<<std::endl;
290  if(!isPIB) throw cms::Exception("LogicError")
291  << "[SiPixelRawDataErrorSource::bookMEs] Creation of DQM folder failed";
292  }
293  }
294 
295  if(ladOn){
296  if(!theSiPixelFolder.setModuleFolder(iBooker,(*struct_iter).first,1,isUpgrade)) {
297  LogDebug ("PixelDQM") << "PROBLEM WITH LADDER-FOLDER\n";
298  }
299  }
300 
301  if(bladeOn){
302  if(!theSiPixelFolder.setModuleFolder(iBooker,(*struct_iter).first,4,isUpgrade)) {
303  LogDebug ("PixelDQM") << "PROBLEM WITH BLADE-FOLDER\n";
304  }
305  }
306 
307  }//for loop
308 
309  for(struct_iter2 = theFEDStructure.begin(); struct_iter2 != theFEDStructure.end(); struct_iter2++){
311  if(!theSiPixelFolder.setFedFolder(iBooker,(*struct_iter2).first)) {
312  throw cms::Exception("LogicError")
313  << "[SiPixelRawDataErrorSource::bookMEs] Creation of DQM folder failed";
314  }
315 
316  }
317 
318  //Booking FED histograms
319  std::string hid;
320  // Get collection name and instantiate Histo Id builder
322  SiPixelHistogramId* theHistogramId = new SiPixelHistogramId( src.label() );
323 
324  for (uint32_t id = 0; id < 40; id++){
325  char temp [50];
326  sprintf( temp, "Pixel/AdditionalPixelErrors/FED_%d",id);
327  iBooker.cd(temp);
328  // Types of errors
329  hid = theHistogramId->setHistoId("errorType",id);
330  meErrorType_[id] = iBooker.book1D(hid,"Type of errors",15,24.5,39.5);
331  meErrorType_[id]->setAxisTitle("Type of errors",1);
332  // Number of errors
333  hid = theHistogramId->setHistoId("NErrors",id);
334  meNErrors_[id] = iBooker.book1D(hid,"Number of errors",36,0.,36.);
335  meNErrors_[id]->setAxisTitle("Number of errors",1);
336  // Type of FIFO full (errorType = 28). FIFO 1 is 1-5 (where fullType = channel of FIFO 1),
337  // fullType = 6 signifies FIFO 2 nearly full, 7 signifies trigger FIFO nearly full, 8
338  // indicates an unexpected result
339  hid = theHistogramId->setHistoId("fullType",id);
340  meFullType_[id] = iBooker.book1D(hid,"Type of FIFO full",7,0.5,7.5);
341  meFullType_[id]->setAxisTitle("FIFO type",1);
342  // For error type 30, the type of problem encoded in the TBM trailer
343  // 0 = stack full, 1 = Pre-cal issued, 2 = clear trigger counter, 3 = sync trigger,
344  // 4 = sync trigger error, 5 = reset ROC, 6 = reset TBM, 7 = no token bit pass
345  hid = theHistogramId->setHistoId("TBMMessage",id);
346  meTBMMessage_[id] = iBooker.book1D(hid,"TBM trailer message",8,-0.5,7.5);
347  meTBMMessage_[id]->setAxisTitle("TBM message",1);
348  // For error type 30, the type of problem encoded in the TBM error trailer 0 = none
349  // 1 = data stream too long, 2 = FSM errors, 3 = invalid # of ROCs, 4 = multiple
350  hid = theHistogramId->setHistoId("TBMType",id);
351  meTBMType_[id] = iBooker.book1D(hid,"Type of TBM trailer",5,-0.5,4.5);
352  meTBMType_[id]->setAxisTitle("TBM Type",1);
353  // For error type 31, the event number of the TBM header with the error
354  hid = theHistogramId->setHistoId("EvtNbr",id);
355  meEvtNbr_[id] = iBooker.book1D(hid,"Event number",1,0,1);
356  // For errorType = 34, datastream size according to error word
357  hid = theHistogramId->setHistoId("evtSize",id);
358  meEvtSize_[id] = iBooker.book1D(hid,"Event size",1,0,1);
359  //
360  hid = theHistogramId->setHistoId("FedChNErr",id);
361  meFedChNErr_[id] = iBooker.book1D(hid,"Number of errors per FED channel",37,0,37);
362  meFedChNErr_[id]->setAxisTitle("FED channel",1);
363  //
364  hid = theHistogramId->setHistoId("FedChLErr",id);
365  meFedChLErr_[id] = iBooker.book1D(hid,"Last error per FED channel",37,0,37);
366  meFedChLErr_[id]->setAxisTitle("FED channel",1);
367  //
368  hid = theHistogramId->setHistoId("FedETypeNErr", id);
369  meFedETypeNErr_[id] = iBooker.book1D(hid,"Number of errors per type",21,0,21);
370  meFedETypeNErr_[id]->setAxisTitle("Error type",1);
371  }
372  //Add the booked histograms to the histogram map for booking
373  meMapFEDs_["meErrorType_"] = meErrorType_;
374  meMapFEDs_["meNErrors_"] = meNErrors_;
375  meMapFEDs_["meFullType_"] = meFullType_;
376  meMapFEDs_["meTBMMessage_"] = meTBMMessage_;
377  meMapFEDs_["meTBMType_"] = meTBMType_;
378  meMapFEDs_["meEvtNbr_"] = meEvtNbr_;
379  meMapFEDs_["meEvtSize_"] = meEvtSize_;
380  meMapFEDs_["meFedChNErr_"] = meFedChNErr_;
381  meMapFEDs_["meFedChLErr_"] = meFedChLErr_;
382  meMapFEDs_["meFedETypeNErr_"] = meFedETypeNErr_;
383 
384  //cout<<"...leaving SiPixelRawDataErrorSource::bookMEs now! "<<endl;
385 }
386 
#define LogDebug(id)
int plaquetteName() const
plaquetteId (in pannel)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
int i
Definition: DBlmapReader.cc:9
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:446
virtual void analyze(const edm::Event &, const edm::EventSetup &)
void cd(void)
Definition: DQMStore.cc:266
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
MonitorElement * meFedETypeNErr_[40]
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:59
int plaquetteName() const
plaquetteId (in pannel)
virtual 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:43
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
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
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
int bladeName() const
blade id
bool isValid() const
Definition: HandleBase.h:76
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:37
int diskName() const
disk id
Definition: DetId.h:18
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
edm::EDGetTokenT< FEDRawDataCollection > inputSourceToken_
const T & get() const
Definition: EventSetup.h:55
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
std::string const & label() const
Definition: InputTag.h:42
std::map< std::string, MonitorElement ** > meMapFEDs_
virtual void buildStructure(edm::EventSetup const &)
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
tuple cout
Definition: gather_cfg.py:121
int diskName() const
disk id
volatile std::atomic< bool > shutdown_flag false
void setLumiFlag(void)
this ME is meant to be stored for each luminosity section
HalfCylinder halfCylinder() const
HalfCylinder halfCylinder() const
int pannelName() const
pannel id
void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)
Definition: vlib.h:208
Pixel error – collection of errors and error information.
Definition: Run.h:41
virtual void dqmBeginRun(const edm::Run &, edm::EventSetup const &)