CMS 3D CMS Logo

SiPixelPhase1Summary.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelPhase1Summary
4 // Class: SiPixelPhase1Summary
5 //
13 //
14 // Original Author: Duncan Leggat
15 // Created: 5th December 2016
16 //
17 //
19 // Framework
23 // DQM Framework
26 // Geometry
32 // DataFormats
39 //
40 #include <string>
41 #include <stdlib.h>
42 #include <iostream>
43 #include <fstream>
44 #include <sstream>
45 
46 using namespace std;
47 using namespace edm;
48 
50  conf_(iConfig),
51  firstLumi(true)
52 {
53 
54  LogInfo ("PixelDQM") << "SiPixelPhase1Summary::SiPixelPhase1Summary: Got DQM BackEnd interface"<<endl;
55  topFolderName_ = conf_.getParameter<std::string>("TopFolderName");
56  runOnEndLumi_ = conf_.getParameter<bool>("RunOnEndLumi");
57  runOnEndJob_ = conf_.getParameter<bool>("RunOnEndJob");
58 
59  std::vector<edm::ParameterSet> mapPSets = conf_.getParameter<std::vector<edm::ParameterSet> >("SummaryMaps");
60 
61  //Go through the configuration file and add in
62  for (auto const mapPSet : mapPSets){
63  summaryPlotName_[mapPSet.getParameter<std::string>("MapName")] = mapPSet.getParameter<std::string>("MapHist");
64  }
65 
66 }
67 
69 {
70  // do anything here that needs to be done at desctruction time
71  // (e.g. close files, deallocate resources etc.)
72  LogInfo ("PixelDQM") << "SiPixelPhase1Summary::~SiPixelPhase1Summary: Destructor"<<endl;
73 }
74 
76 }
77 
79  if (firstLumi){
80  bookSummaries(iBooker);
81  bookTrendPlots(iBooker);
82  firstLumi = false;
83  }
84 
85  if (runOnEndLumi_){
86  fillSummaries(iBooker,iGetter);
87  int lumiSec = lumiSeg.id().luminosityBlock();
88  fillTrendPlots(iBooker,iGetter,lumiSec);
89  }
90 
91  // iBooker.cd();
92 
93 }
94 
95 //------------------------------------------------------------------
96 // Method called for every event
97 //------------------------------------------------------------------
99 {
100  if (firstLumi){ //Book the plots in the (maybe possible?) case that they aren't booked in the dqmEndLuminosityBlock method
101  bookSummaries(iBooker);
102  bookTrendPlots(iBooker);
103  firstLumi = false;
104  }
105  if (runOnEndJob_){
106  fillSummaries(iBooker,iGetter);
107  if (!runOnEndLumi_) fillTrendPlots(iBooker,iGetter); //If we're filling these plots at the end lumi step, it doesn't really make sense to also do them at the end job
108  }
109 
110 }
111 
112 //------------------------------------------------------------------
113 // Used to book the summary plots
114 //------------------------------------------------------------------
116 
117  iBooker.cd();
118 
119  std::vector<std::string> xAxisLabels_ = {"BMO","BMI","BPO ","BPI","HCMO_1","HCMO_2","HCMI_1","HCMI_2","HCPO_1","HCPO_2","HCPI_1","HCPI_2"}; // why not having a global variable !?!?!?!
120  std::vector<std::string> yAxisLabels_ = {"1","2","3","4"}; // why not having a global variable ?!?!?!!? - I originally did, but was told not to by David Lange!
121 
122  iBooker.setCurrentFolder("PixelPhase1/Summary");
123  //Book the summary plots for the variables as described in the config file
124  for (auto mapInfo: summaryPlotName_){
125  auto name = mapInfo.first;
126  summaryMap_[name] = iBooker.book2D("pixel"+name+"Summary","Pixel "+name+" Summary",12,0,12,4,0,4);
127  }
128  //Now book the overall summary map
129  iBooker.setCurrentFolder("PixelPhase1/EventInfo");
130  summaryMap_["Grand"] = iBooker.book2D("reportSummaryMap","Pixel Summary Map",12,0,12,4,0,4);
131  reportSummary = iBooker.bookFloat("reportSummary");
132 
133  //Now set up axis and bin labels
134  for (auto summaryMapEntry: summaryMap_){
135  auto summaryMap = summaryMapEntry.second;
136  for (unsigned int i = 0; i < xAxisLabels_.size(); i++){
137  summaryMap->setBinLabel(i+1, xAxisLabels_[i],1);
138  }
139  for (unsigned int i = 0; i < yAxisLabels_.size(); i++){
140  summaryMap->setBinLabel(i+1,yAxisLabels_[i],2);
141  }
142  summaryMap->setAxisTitle("Subdetector",1);
143  summaryMap->setAxisTitle("Layer/disk",2);
144  for (int i = 0; i < 12; i++){ // !??!?!? xAxisLabels_.size() ?!?!
145  for (int j = 0; j < 4; j++){ // !??!?!? yAxisLabels_.size() ?!?!?!
146  summaryMap->Fill(i,j,-1.);
147  }
148  }
149  }
150  reportSummary->Fill(-1.);
151  //Reset the iBooker
152  iBooker.setCurrentFolder("PixelPhase1/");
153 }
154 
155 //------------------------------------------------------------------
156 // Used to book the trend plots
157 //------------------------------------------------------------------
159  //We need different plots depending on if we're online (runOnEndLumi) or offline (!runOnEndLumi)
160  iBooker.setCurrentFolder("PixelPhase1/");
161  if (runOnEndLumi_){
162  deadROCTrends_[bpix] = iBooker.book1D("deadRocTrendBPix","BPIX dead ROC trend",500,0.,5000);
163  deadROCTrends_[bpix]->setAxisTitle("Lumisection",1);
164  deadROCTrends_[fpix] = iBooker.book1D("deadRocTrendFPix","FPIX dead ROC trend",500,0.,5000);
165  deadROCTrends_[fpix]->setAxisTitle("Lumisection",1);
166  ineffROCTrends_[bpix] = iBooker.book1D("ineffRocTrendBPix","BPIX inefficient ROC trend",500,0.,5000);
167  ineffROCTrends_[bpix]->setAxisTitle("Lumisection",1);
168  ineffROCTrends_[fpix] = iBooker.book1D("ineffRocTrendFPix","FPIX inefficient ROC trend",500,0.,5000);
169  ineffROCTrends_[fpix]->setAxisTitle("Lumisection",1);
170  }
171  else {
172  deadROCTrends_[offline] = iBooker.book1D("deadRocTotal","N dead ROCs",2,0,2);
173  deadROCTrends_[offline]->setBinLabel(1,"Barrel");
174  deadROCTrends_[offline]->setBinLabel(2,"Endcap");
175  deadROCTrends_[offline]->setAxisTitle("Subdetector",1);
176  ineffROCTrends_[offline] = iBooker.book1D("ineffRocTotal","N inefficient ROCs",2,0,2);
177  ineffROCTrends_[offline]->setBinLabel(1,"Barrel");
178  ineffROCTrends_[offline]->setBinLabel(2,"Endcap");
179  ineffROCTrends_[offline]->setAxisTitle("Subdetector",1);
180 
181  }
182 
183 }
184 
185 //------------------------------------------------------------------
186 // Fill the summary histograms
187 //------------------------------------------------------------------
189  //Firstly, we will fill the regular summary maps.
190  for (auto mapInfo: summaryPlotName_){
191  auto name = mapInfo.first;
192  std::ostringstream histNameStream;
193  std::string histName;
194 
195  for (int i = 0; i < 12; i++){ // !??!?!? xAxisLabels_.size() ?!?!
196  for (int j = 0; j < 4; j++){ // !??!?!? yAxisLabels_.size() ?!?!?!
197  if (i > 3 && j == 3) continue;
198  bool minus = i < 2 || (i > 3 && i < 8); // bleah !
199  int iOver2 = floor(i/2.);
200  bool outer = (i > 3)?iOver2%2==0:i%2==0;
201  //Complicated expression that creates the name of the histogram we are interested in.
202  histNameStream.str("");
203  histNameStream << topFolderName_.c_str() << "PX" << ((i > 3)?"Forward":"Barrel") << "/" << ((i > 3)?"HalfCylinder":"Shell") << "_" << (minus?"m":"p") << ((outer)?"O":"I") << "/" << ((i > 3)?((i%2 == 0)?"PXRing_1/":"PXRing_2/"):"") << summaryPlotName_[name].c_str() << "_PX" << ((i > 3)?"Disk":"Layer") << "_" << ((i>3)?((minus)?"-":"+"):"") << (j+1);
204  histName = histNameStream.str();
205  MonitorElement * me = iGetter.get(histName);
206 
207  if (!me) {
208  edm::LogWarning("SiPixelPhase1Summary") << "ME " << histName << " is not available !!";
209  continue; // Ignore non-existing MEs, as this can cause the whole thing to crash
210  }
211 
212  if (!summaryMap_[name]){
213  edm::LogWarning("SiPixelPhase1Summary") << "Summary map " << name << " is not available !!";
214  continue; // Based on reported errors it seems possible that we're trying to access a non-existant summary map, so if the map doesn't exist but we're trying to access it here we'll skip it instead.
215  }
216  if ((me->getQReports()).size()!=0) summaryMap_[name]->setBinContent(i+1,j+1,(me->getQReports())[0]->getQTresult());
217  else summaryMap_[name]->setBinContent(i+1,j+1,-1);
218  }
219  }
220  }
221  //Sum of non-negative bins for the reportSummary
222  float sumOfNonNegBins = 0.;
223  //Now we will use the other summary maps to create the overall map.
224  for (int i = 0; i < 12; i++){ // !??!?!? xAxisLabels_.size() ?!?!
225  if (!summaryMap_["Grand"]){
226  edm::LogWarning("SiPixelPhase1Summary") << "Grand summary does not exist!";
227  break;
228  }
229  for (int j = 0; j < 4; j++){ // !??!?!? yAxisLabels_.size() ?!?!?!
230  summaryMap_["Grand"]->setBinContent(i+1,j+1,1); // This resets the map to be good. We only then set it to 0 if there has been a problem in one of the other summaries.
231  for (auto const mapInfo: summaryPlotName_){ //Check summary maps
232  auto name = mapInfo.first;
233  if (!summaryMap_[name]){
234  edm::LogWarning("SiPixelPhase1Summary") << "Summary " << name << " does not exist!";
235  continue;
236  }
237  if (summaryMap_["Grand"]->getBinContent(i+1,j+1) > summaryMap_[name]->getBinContent(i+1,j+1)) summaryMap_["Grand"]->setBinContent(i+1,j+1,summaryMap_[name]->getBinContent(i+1,j+1));
238  }
239  if (summaryMap_["Grand"]->getBinContent(i+1,j+1) > -0.1) sumOfNonNegBins += summaryMap_["Grand"]->getBinContent(i+1,j+1);
240  }
241  }
242  reportSummary->Fill(sumOfNonNegBins/40.); // The average of the 40 useful bins in the summary map.
243 
244 }
245 
246 //------------------------------------------------------------------
247 // Fill the trend plots
248 //------------------------------------------------------------------
250 
251  // If we're running in online mode and the lumi section is not modulo 10, return. Offline running always uses lumiSec=0, so it will pass this test.
252  if (lumiSec%10 != 0) return;
253 
254  std::ostringstream histNameStream;
255  std::string histName;
256 
257 
258  //Find the total number of filled bins and hi efficiency bins
259  int nFilledROCsFPix = 0, nFilledROCsBPix = 0;
260  int hiEffROCsFPix = 0, hiEffROCsBPix = 0;
261  std::vector<int> nRocsPerLayer = {1536,3584,5632,8192};
262  std::vector<int> nRocsPerRing = {4224,6528};
263  //Loop over layers. This will also do the rings, but we'll skip the ring calculation for
264  for (auto it : {1,2,3,4}){
265 
266  iGetter.cd();
267  histNameStream.str("");
268  histNameStream << "PixelPhase1/Phase1_MechanicalView/PXBarrel/digi_occupancy_per_SignedModuleCoord_per_SignedLadderCoord_PXLayer_" << it;
269  histName = histNameStream.str();
270  MonitorElement * tempLayerME = iGetter.get(histName);
271  if (!tempLayerME) continue;
272  float lowEffValue = 0.25 * tempLayerME->getTH1()->Integral() / nRocsPerLayer[it-1];
273  for (int i=1; i<=tempLayerME->getTH1()->GetXaxis()->GetNbins(); i++){
274  for (int j=1; j<=tempLayerME->getTH1()->GetYaxis()->GetNbins(); j++){
275  if (tempLayerME->getBinContent(i,j) > 0.) nFilledROCsBPix++;
276  if (tempLayerME->getBinContent(i,j) > lowEffValue) hiEffROCsBPix++;
277  }
278  }
279  if (runOnEndLumi_) tempLayerME->Reset(); //If we're doing online monitoring, reset the digi maps.
280  if (it > 2) continue;
281  //And now do the fpix if we're in the first 2 layers
282  histNameStream.str("");
283  histNameStream << "PixelPhase1/Phase1_MechanicalView/PXForward/digi_occupancy_per_SignedDiskCoord_per_SignedBladePanelCoord_PXRing_" << it;
284  histName = histNameStream.str();
285  MonitorElement * tempDiskME = iGetter.get(histName);
286  lowEffValue = 0.25 * tempDiskME->getTH1()->Integral()/ nRocsPerRing[it-1];
287  for (int i=1; i<=tempDiskME->getTH1()->GetXaxis()->GetNbins(); i++){
288  for (int j=1; j<=tempDiskME->getTH1()->GetYaxis()->GetNbins(); j++){
289  if (tempDiskME->getBinContent(i,j) > 0.) nFilledROCsFPix++;
290  if (tempDiskME->getBinContent(i,j) > lowEffValue) hiEffROCsFPix++;
291  }
292  }
293  if (runOnEndLumi_) tempLayerME->Reset();
294 
295 
296  } // Close layers/ring loop
297 
298  if (!runOnEndLumi_) { //offline
299  deadROCTrends_[offline]->setBinContent(1,18944-nFilledROCsBPix);
300  deadROCTrends_[offline]->setBinContent(2,10752-nFilledROCsFPix);
301  ineffROCTrends_[offline]->setBinContent(1,nFilledROCsBPix-hiEffROCsBPix);
302  ineffROCTrends_[offline]->setBinContent(2,nFilledROCsFPix-hiEffROCsFPix);
303  }
304  else { //online
305  deadROCTrends_[fpix]->setBinContent(lumiSec/10,10752-nFilledROCsFPix);
306  deadROCTrends_[bpix]->setBinContent(lumiSec/10,18944-nFilledROCsBPix);
307  ineffROCTrends_[fpix]->setBinContent(lumiSec/10,nFilledROCsFPix-hiEffROCsFPix);
308  ineffROCTrends_[bpix]->setBinContent(lumiSec/10,nFilledROCsBPix-hiEffROCsBPix);
309  }
310 
311 }
312 
313 //define this as a plug-in
size
Write out results.
LuminosityBlockID id() const
T getParameter(std::string const &) const
void cd(void)
Definition: DQMStore.cc:339
SiPixelPhase1Summary(const edm::ParameterSet &conf)
std::map< std::string, std::string > summaryPlotName_
void cd(void)
Definition: DQMStore.cc:269
MonitorElement * get(const std::string &path)
Definition: DQMStore.cc:305
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::map< trendPlots, MonitorElement * > deadROCTrends_
void fillSummaries(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter)
void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
std::map< trendPlots, MonitorElement * > ineffROCTrends_
void fillTrendPlots(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, int lumiSeg=0)
void Fill(long long x)
std::map< std::string, MonitorElement * > summaryMap_
void beginRun(edm::Run const &run, edm::EventSetup const &eSetup)
edm::ParameterSet conf_
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
TH1 * getTH1(void) const
void bookTrendPlots(DQMStore::IBooker &iBooker)
MonitorElement * reportSummary
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:277
std::vector< QReport * > getQReports(void) const
get map of QReports
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
LuminosityBlockNumber_t luminosityBlock() const
void dqmEndJob(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter) override
double getBinContent(int binx) const
get content of bin (1-D)
HLT enums.
MonitorElement * bookFloat(Args &&...args)
Definition: DQMStore.h:109
void bookSummaries(DQMStore::IBooker &iBooker)
void dqmEndLuminosityBlock(DQMStore::IBooker &iBooker, DQMStore::IGetter &iGetter, edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &c) override
void Reset(void)
reset ME (ie. contents, errors, etc)
Definition: Run.h:42