CMS 3D CMS Logo

SiPixelGainCalibrationAnalysis.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: SiPixelGainCalibrationAnalysis
4 // Class: SiPixelGainCalibrationAnalysis
5 //
13 //
14 // Original Author: Freya Blekman
15 // Created: Wed Nov 14 15:02:06 CET 2007
16 //
17 //
18 
19 // user include files
21 
23 #include <sstream>
24 #include <vector>
25 #include <cmath>
26 #include "TGraphErrors.h"
27 #include "TMath.h"
28 
29 using std::cout;
30 using std::endl;
31 //
32 // constructors and destructor
33 //
36  conf_(iConfig),
37  bookkeeper_(),
38  bookkeeper_pixels_(),
39  nfitparameters_(iConfig.getUntrackedParameter<int>("numberOfFitParameters",2)),
40  fitfunction_(iConfig.getUntrackedParameter<std::string>("fitFunctionRootFormula","pol1")),
41  listofdetids_(conf_.getUntrackedParameter<std::vector<uint32_t> >("listOfDetIDs")),
42  ignoreMode_(conf_.getUntrackedParameter<bool>("ignoreMode",false)),
43  reject_plateaupoints_(iConfig.getUntrackedParameter<bool>("suppressPlateauInFit",true)),
44  reject_single_entries_(iConfig.getUntrackedParameter<bool>("suppressPointsWithOneEntryOrLess",true)),
45  plateau_max_slope_(iConfig.getUntrackedParameter<double>("plateauSlopeMax",1.0)),
46  reject_first_point_(iConfig.getUntrackedParameter<bool>("rejectVCalZero",true)),
47  reject_badpoints_frac_(iConfig.getUntrackedParameter<double>("suppressZeroAndPlateausInFitFrac",0)),
48  bookBIGCalibPayload_(iConfig.getUntrackedParameter<bool>("saveFullPayloads",false)),
49  savePixelHists_(iConfig.getUntrackedParameter<bool>("savePixelLevelHists",false)),
50  chi2Threshold_(iConfig.getUntrackedParameter<double>("minChi2NDFforHistSave",10)),
51  chi2ProbThreshold_(iConfig.getUntrackedParameter<double>("minChi2ProbforHistSave",0.05)),
52  maxGainInHist_(iConfig.getUntrackedParameter<double>("maxGainInHist",10)),
53  maxChi2InHist_(iConfig.getUntrackedParameter<double>("maxChi2InHist",25)),
54  saveALLHistograms_(iConfig.getUntrackedParameter<bool>("saveAllHistograms",false)),
55 
56 
57  filldb_(iConfig.getUntrackedParameter<bool>("writeDatabase",false)),
58  writeSummary_(iConfig.getUntrackedParameter<bool>("writeSummary",true)),
59  recordName_(conf_.getParameter<std::string>("record")),
60 
61  appendMode_(conf_.getUntrackedParameter<bool>("appendMode",true)),
62  /*theGainCalibrationDbInput_(0),
63  theGainCalibrationDbInputOffline_(0),
64  theGainCalibrationDbInputHLT_(0),
65  theGainCalibrationDbInputService_(iConfig),*/
66  gainlow_(10.),gainhi_(0.),pedlow_(255.),pedhi_(0.),
67  useVcalHigh_(conf_.getParameter<bool>("useVCALHIGH")),
68  scalarVcalHigh_VcalLow_(conf_.getParameter<double>("vcalHighToLowConversionFac"))
69 {
71  min_nentries_=1;
72  else
73  min_nentries_=0;
74  ::putenv((char*)"CORAL_AUTH_USER=me");
75  ::putenv((char*)"CORAL_AUTH_PASSWORD=test");
76  edm::LogInfo("SiPixelGainCalibrationAnalysis") << "now using fit function " << fitfunction_ << ", which has " << nfitparameters_ << " free parameters. " << std::endl;
77  func_= new TF1("func",fitfunction_.c_str(),0,256*scalarVcalHigh_VcalLow_);
78  graph_ = new TGraphErrors();
79  currentDetID_=0;
80  summary_.open("SummaryPerDetID.txt");
81  statusNumbers_ = new int[10];
82  for(int ii=0;ii<10;ii++)
83  statusNumbers_[ii]=0;
84 }
85 
87 {
88 }
89 // member functions
90 //
91 // ------------ method called once each job just before starting event loop ------------
92 
94  std::vector<float> result;
95  int ncols= bookkeeper_[detid][label]->getNbinsX();
96  int nrows= bookkeeper_[detid][label]->getNbinsY();
97  for(int icol=1; icol<=ncols; ++icol){
98  float val=0;
99  float ntimes =0;
100  for(int irow=1; irow<=nrows; ++irow){
101  val+= bookkeeper_[detid][label]->getBinContent(icol,irow);
102  ntimes++;
103  }
104  val/= ntimes;
105  result.push_back(val);
106  }
107  return result;
108 }
109 
110 bool
112 {
113  if(calibrationMode_=="GainCalibration")
114  return true;
115  else if(ignoreMode_==true)
116  return true;
117  else if(calibrationMode_=="unknown"){
118  edm::LogInfo("SiPixelGainCalibrationAnalysis") << "calibration mode is: " << calibrationMode_ << ", continuing anyway..." ;
119  return true;
120  }
121  else{
122  // edm::LogError("SiPixelGainCalibrationAnalysis") << "unknown calibration mode for Gain calibration, should be \"Gain\" and is \"" << calibrationMode_ << "\"";
123  }
124  return false;
125 }
126 
128 {
129 }
130 //------- summary printing method. Very verbose.
131 void
133 
134  uint32_t detid=0;
135  for(std::map<uint32_t,std::map<std::string,MonitorElement *> >::const_iterator idet = bookkeeper_.begin(); idet != bookkeeper_.end(); ++idet){
136  if(detid==idet->first)
137  continue;// only do things once per detid
138  detid=idet->first;
139  std::vector<float> gainvec=CalculateAveragePerColumn(detid,"gain_2d");
140  std::vector<float> pedvec =CalculateAveragePerColumn(detid,"ped_2d");
141  std::vector<float> chi2vec = CalculateAveragePerColumn(detid,"chi2_2d");
142  std::ostringstream summarytext;
143 
144  summarytext << "Summary for det ID " << detid << "(" << translateDetIdToString(detid) << ")\n";
145  summarytext << "\t Following: values per column: column #, gain, pedestal, chi2\n";
146  for(uint32_t i=0; i<gainvec.size(); i++)
147  summarytext << "\t " << i << " \t" << gainvec[i] << " \t" << pedvec[i] << " \t" << chi2vec[i] << "\n";
148  summarytext << "\t list of pixels with high chi2 (chi2> " << chi2Threshold_ << "): \n";
149 
150 
151  for(std::map<std::string, MonitorElement *>::const_iterator ipix = bookkeeper_pixels_[detid].begin(); ipix!=bookkeeper_pixels_[detid].end(); ++ipix)
152  summarytext << "\t " << ipix->first << "\n";
153  edm::LogInfo("SiPixelGainCalibrationAnalysis") << summarytext.str() << std::endl;
154 
155  }
156  if(summary_.is_open()){
157  summary_.close();
158  summary_.open("Summary.txt");
159  summary_<<"Total Number of Pixel computed :"<<statusNumbers_[9]<<endl;
160  summary_<<"Number of pixel tagged with status :"<<endl;
161  for(int ii=0;ii<9;ii++)
162  summary_<<ii<<" -> "<<statusNumbers_[ii]<<" ~ "<<double(statusNumbers_[ii])/double(statusNumbers_[9])*100.<<" %"<<endl;
163 
164  summary_.close();
165 
166  }
167 
168 }
169 
170 // ------------ method called once each job just after ending the event loop ------------
171 
172 void
174 
176 
177  // this is where we loop over all histograms and save the database objects
178  if(filldb_)
179  fillDatabase();
180 }
181 //-----------method to fill the database
183  // only create when necessary.
184  // process the minimum and maximum gain & ped values...
185  edm::LogError("SiPixelGainCalibration::fillDatabase()") << "PLEASE do not fill the database directly from the gain calibration analyzer. This function is currently disabled and no DB payloads will be produced!" << std::endl;
186 
187 }
188 // ------------ method called to do fits to all objects available ------------
189 bool
190 SiPixelGainCalibrationAnalysis::doFits(uint32_t detid, std::vector<SiPixelCalibDigi>::const_iterator ipix)
191 {
192  float lowmeanval=255;
193  float highmeanval=0;
194  bool makehistopersistent = saveALLHistograms_;
195  std::vector<uint32_t>::const_iterator detidfinder=find(listofdetids_.begin(),listofdetids_.end(),detid);
196  if(detidfinder!=listofdetids_.end())
197  makehistopersistent=true;
198  // first, fill the input arrays to the TLinearFitter.
199  double xvals[257];
200  double yvals[256];
201  double yerrvals[256];
202  double xvalsall[257];
203  double yvalsall[256];
204  double yerrvalsall[256];
205  int npoints=0;
206  int nallpoints=0;
207  bool use_point=true;
208  int status=0;
209  statusNumbers_[9]++;
210 
211  bookkeeper_[detid]["status_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,0);
212  if(writeSummary_ && detid!=currentDetID_){
213  currentDetID_ = detid;
214  summary_<<endl<<"DetId_"<<currentDetID_<<endl;
215  }
216 
217  for(uint32_t ii=0; ii< ipix->getnpoints() && ii<200; ii++){
218  // std::cout << ipix->getsum(ii) << " " << ipix->getnentries(ii) << " " << ipix->getsumsquares(ii) << std::endl;
219  nallpoints++;
220  use_point=true;
221  if(useVcalHigh_){
223  }
224  else
225  xvalsall[ii]=vCalValues_[ii];
226  yerrvalsall[ii]=yvalsall[ii]=0;
227 
228  if(ipix->getnentries(ii)>min_nentries_){
229  yvalsall[ii]=ipix->getsum(ii)/(float)ipix->getnentries(ii);
230  yerrvalsall[ii]=ipix->getsumsquares(ii)/(float)(ipix->getnentries(ii));
231  yerrvalsall[ii]-=pow(yvalsall[ii],2);
232  yerrvalsall[ii]=sqrt(yerrvalsall[ii])/sqrt(ipix->getnentries(ii));
233 
234  if(yvalsall[ii]<lowmeanval)
235  lowmeanval=yvalsall[ii];
236  if(yvalsall[ii]>highmeanval)
237  highmeanval=yvalsall[ii];
238  }
239  }
240 
241  // calculate plateau value from last 4 entries
242  double plateauval=0;
243  bool noPlateau=false;
244  if(nallpoints>=4){
245  for(int ii=nallpoints-1; ii>nallpoints-5; --ii) plateauval+=yvalsall[ii];
246  plateauval/=4;
247  for(int ii=nallpoints-1; ii>nallpoints-5; --ii){
248  if(fabs(yvalsall[ii]-plateauval)>5){
249  plateauval=255;
250  noPlateau=true;
251  continue;
252  }
253  }
254 
255  int NbofPointsInPlateau=0;
256  for(int ii=0; ii<nallpoints; ++ii)
257  if(fabs(yvalsall[ii]-plateauval)<10 || yvalsall[ii]==0) NbofPointsInPlateau++;
258  //summary_<<"row_"<<ipix->row()<<" col_"<<ipix->col()<<" "<<plateauval<<" "<<NbofPointsInPlateau<<" "<<nallpoints<<endl;
259  if(NbofPointsInPlateau>=(nallpoints-2)){
260  status=-2;
261  bookkeeper_[detid]["status_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,status);
262  if(writeSummary_){
263  summary_<<"row_"<<ipix->row()<<" col_"<<ipix->col()<<" status_"<<status<<endl;
264  statusNumbers_[abs(status)]++;
265  }
266  return false;
267  }
268  }
269  else plateauval=255;
270 
271  double maxgoodvalinfit=plateauval*(1.-reject_badpoints_frac_);
272  npoints=0;
273  for(int ii=0; ii<nallpoints; ++ii){
274 
275  // now selecting the appropriate points for the fit.
276  use_point=true;
277  if(reject_first_point_ && xvalsall[ii]<0.1)
278  use_point=false;
279  if(ipix->getnentries(ii)<=min_nentries_ && reject_single_entries_)
280  use_point=false;
281  if(ipix->getnentries(ii)==0 && reject_badpoints_)
282  use_point=false;
283  if(yvalsall[ii]>maxgoodvalinfit && !noPlateau)
284  use_point=false;
285  if(ii>1 && fabs(yvalsall[ii]-yvalsall[ii-1])<5. && yvalsall[ii]>0.8*maxgoodvalinfit && reject_plateaupoints_){
286  use_point=false;
287  break;
288  }
289 
290  if(use_point){
291  xvals[npoints]=xvalsall[ii];
292  yvals[npoints]=yvalsall[ii];
293  yerrvals[npoints]=yerrvalsall[ii];
294  npoints++;
295  }
296  }
297 
298  float chi2,slope,intercept,prob,slopeerror,intercepterror;
299  prob=chi2=-1;
300  slope=intercept=slopeerror=intercepterror=0;
301 
302 
303  // now check on number of points. If bad just start taking the first 4:
304 
305  if(npoints<4){
306  npoints=0;
307  for(int ii=0; ii<nallpoints && npoints<4 && yvalsall[ii]<plateauval*0.97; ++ii){
308  if(yvalsall[ii]>0){
309  if(ii>0 && yvalsall[ii]-yvalsall[ii-1]<0.1)
310  continue;
311  xvals[npoints]=xvalsall[ii];
312  yvals[npoints]=yvalsall[ii];
313  yerrvals[npoints]=yerrvalsall[ii];
314  npoints++;
315  }
316  }
317  }
318  if(npoints<2){
319  status = -7;
320  bookkeeper_[detid]["status_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,status);
321  if(writeSummary_){
322  summary_<<"row_"<<ipix->row()<<" col_"<<ipix->col()<<" status_"<<status<<endl;
323  statusNumbers_[abs(status)]++;
324  }
325  std::ostringstream pixelinfo;
326  pixelinfo << "GainCurve_row_" << ipix->row() << "_col_" << ipix->col();
327  std::string tempname=translateDetIdToString(detid);
328  tempname+="_";
329  tempname+=pixelinfo.str();
330  setDQMDirectory(detid);
331  bookkeeper_pixels_[detid][pixelinfo.str()] = bookDQMHistogram1D(detid,pixelinfo.str(),tempname,105*nallpoints,xvalsall[0],xvalsall[nallpoints-1]*1.05);
332  for(int ii=0; ii<nallpoints; ++ii)
333  bookkeeper_pixels_[detid][pixelinfo.str()]->Fill(xvalsall[ii],yvalsall[ii]);
334  return false;
335  }
336 
337  // std::cout << "starting fit!" << std::endl;
338  graph_->Set(npoints);
339 
340  func_->SetParameter(0,50.);
341  func_->SetParameter(1,0.25);
342  for(int ipointtemp=0; ipointtemp<npoints; ++ipointtemp){
343  graph_->SetPoint(ipointtemp,xvals[ipointtemp],yvals[ipointtemp]);
344  graph_->SetPointError(ipointtemp,0,yerrvals[ipointtemp]);
345  }
346  Int_t tempresult = graph_->Fit(func_,"FQ0N");
347  slope=func_->GetParameter(1);
348  slopeerror=func_->GetParError(1);
349  intercept=func_->GetParameter(0);
350  intercepterror=func_->GetParError(0);
351  chi2=func_->GetChisquare()/((float)npoints-func_->GetNpar());
352  prob= TMath::Prob(func_->GetChisquare(),npoints-func_->GetNpar());
353  size_t ntimes=0;
354  while((isnan(slope) || isnan(intercept) )&& ntimes<10){
355  ntimes++;
356  makehistopersistent=true;
357  // std::cout << slope << " " << intercept << " " << prob << std::endl;
358  edm::LogWarning("SiPixelGainCalibrationAnalysis") << "impossible to fit values, try " << ntimes << ": " ;
359  for(int ii=0; ii<npoints; ++ii){
360  edm::LogWarning("SiPixelGainCalibrationAnalysis")<< "vcal " << xvals[ii] << " response: " << yvals[ii] << "+/-" << yerrvals[ii] << std::endl;
361  }
362  tempresult = graph_->Fit(func_,"FQ0NW");
363  slope=func_->GetParameter(1);
364  slopeerror=func_->GetParError(1);
365  intercept = func_->GetParameter(0);
366  intercepterror=func_->GetParError(0);
367  chi2=func_->GetChisquare()/((float)npoints-func_->GetNpar());
368  prob= TMath::Prob(func_->GetChisquare(),npoints-func_->GetNpar());
369  }
370 
371  if(tempresult==0)
372  status=1;
373  else
374  status=0;
375  if(slope!=0)
376  slope = 1./slope;
377  if(isnan(slope) || isnan(intercept)){
378  status=-6;
379  bookkeeper_[detid]["status_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,status);
380  if(writeSummary_){
381  summary_<<"row_"<<ipix->row()<<" col_"<<ipix->col()<<" status_"<<status<<endl;
382  statusNumbers_[abs(status)]++;
383  }
384  //return false;
385  }
386  if(chi2>chi2Threshold_ && chi2Threshold_>=0)
387  status=5;
388  if(prob<chi2ProbThreshold_)
389  status=5;
390  if(noPlateau)
391  status=3;
392  if(nallpoints<4)
393  status=-7;
394  if(TMath::Abs(slope>maxGainInHist_) || slope < 0)
395  status=-8;
396  if(status!=1)
397  makehistopersistent=true;
398  statusNumbers_[abs(status)]++;
399 
400 
401  if(slope<gainlow_)
402  gainlow_=slope;
403  if(slope>gainhi_)
404  gainhi_=slope;
405  if(intercept>pedhi_)
406  pedhi_=intercept;
407  if(intercept<pedlow_)
408  pedlow_=intercept;
409  bookkeeper_[detid]["gain_1d"]->Fill(slope);
410  if(slope>maxGainInHist_){
411  makehistopersistent=true;
412  edm::LogWarning("SiPixelGainCalibration") << "For DETID " << detid << "pixel row,col " << ipix->row() << "," << ipix->col() << " Gain was measured to be " << slope << " which is outside the range of the summary plot (" <<maxGainInHist_ << ") !!!! " << std::endl;
413  }
414  bookkeeper_[detid]["dynamicrange_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,highmeanval-lowmeanval);
415  bookkeeper_[detid]["plateau_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,highmeanval);
416  bookkeeper_[detid]["gain_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,slope);
417  bookkeeper_[detid]["errorgain_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,slopeerror);
418  bookkeeper_[detid]["ped_1d"]->Fill(intercept);
419  bookkeeper_[detid]["ped_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,intercept);
420  bookkeeper_[detid]["errorped_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,intercepterror);
421  bookkeeper_[detid]["chi2_1d"]->Fill(chi2);
422  bookkeeper_[detid]["chi2_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,chi2);
423  bookkeeper_[detid]["prob_1d"]->Fill(prob);
424  bookkeeper_[detid]["prob_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,prob);
425  bookkeeper_[detid]["lowpoint_1d"]->Fill(xvals[0]);
426  bookkeeper_[detid]["lowpoint_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,xvals[0]);
427  bookkeeper_[detid]["highpoint_1d"]->Fill(xvals[npoints-1]);
428  bookkeeper_[detid]["highpoint_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,xvals[npoints-1]);
429  bookkeeper_[detid]["nfitpoints_1d"]->Fill(npoints);
430  bookkeeper_[detid]["endpoint_1d"]->Fill((255 - intercept)*slope);
431  bookkeeper_[detid]["status_2d"]->setBinContent(ipix->col()+1,ipix->row()+1,status);
432 
433  if(!savePixelHists_)
434  return true;
435  if(detidfinder==listofdetids_.end() && !listofdetids_.empty())
436  return true;
437  if(makehistopersistent){
438  std::ostringstream pixelinfo;
439  pixelinfo << "GainCurve_row_" << ipix->row() << "_col_" << ipix->col();
440  std::string tempname=translateDetIdToString(detid);
441  tempname+="_";
442  tempname+=pixelinfo.str();
443 
444  // and book the histo
445  // fill the last value of the vcal array...
446 
447  setDQMDirectory(detid);
448  bookkeeper_pixels_[detid][pixelinfo.str()] = bookDQMHistogram1D(detid,pixelinfo.str(),tempname,105*nallpoints,xvalsall[0],xvalsall[nallpoints-1]*1.05);
449 
450  edm::LogInfo("SiPixelGainCalibrationAnalysis") << "now saving histogram for pixel " << tempname << ", gain = " << slope << ", pedestal = " << intercept << ", chi2/NDF=" << chi2 << "(prob:" << prob << "), fit status " << status;
451  for(int ii=0; ii<nallpoints; ++ii){
452  // std::cout << xvalsall[ii]<<","<<yvalsall[ii]<< " " << tempfloats[ii] << std::endl;
453  bookkeeper_pixels_[detid][pixelinfo.str()]->Fill(xvalsall[ii],yvalsall[ii]);
454  }
455 
456  // addTF1ToDQMMonitoringElement(bookkeeper_pixels_[detid][pixelinfo.str()],func_);
457 
458 
459  if(writeSummary_){
460  summary_<<"row_"<<ipix->row()<<" col_"<<ipix->col();
461  summary_<<" status_"<<status;
462  summary_<<endl;
463 
464  //std::cout<<detid<<" "<<"row " <<ipix->row()<<" col "<<ipix->col()<<" "<<status<<" "<<chi2<<" "<<prob<<" "<<npoints<<" "<<xvals[0]<<" "<<xvals[npoints-1]<<" "<<plateauval<<std::endl;
465  }
466  }
467  return true;
468 }
469 // ------------ method called to do fill new detids ------------
470 void
472 {
473  setDQMDirectory(detid);
474  std::string tempname=translateDetIdToString(detid);
475  bookkeeper_[detid]["gain_1d"] = bookDQMHistogram1D(detid,"Gain1d","gain for "+tempname,100,0.,maxGainInHist_);
476  bookkeeper_[detid]["gain_2d"] = bookDQMHistoPlaquetteSummary2D(detid, "Gain2d","gain for "+tempname);
477  bookkeeper_[detid]["errorgain_2d"] = bookDQMHistoPlaquetteSummary2D(detid, "ErrorGain2d","error on gain for "+tempname);
478  bookkeeper_[detid]["ped_1d"] = bookDQMHistogram1D(detid,"Pedestal1d","pedestal for "+tempname,256,0.,256.0);
479  bookkeeper_[detid]["ped_2d"] = bookDQMHistoPlaquetteSummary2D(detid,"Pedestal2d","pedestal for "+tempname);
480  bookkeeper_[detid]["errorped_2d"] = bookDQMHistoPlaquetteSummary2D(detid,"ErrorPedestal2d","error on pedestal for "+tempname);
481  bookkeeper_[detid]["chi2_1d"] = bookDQMHistogram1D(detid,"GainChi2NDF1d","#chi^{2}/NDOF for "+tempname,100,0.,maxChi2InHist_);
482  bookkeeper_[detid]["chi2_2d"] = bookDQMHistoPlaquetteSummary2D(detid,"GainChi2NDF2d","#chi^{2}/NDOF for "+tempname);
483  bookkeeper_[detid]["prob_1d"] = bookDQMHistogram1D(detid,"GainChi2Prob1d","P(#chi^{2},NDOF) for "+tempname,100,0.,1.0);
484  bookkeeper_[detid]["prob_2d"] = bookDQMHistoPlaquetteSummary2D(detid,"GainChi2Prob2d","P(#chi^{2},NDOF) for "+tempname);
485  bookkeeper_[detid]["status_2d"] = bookDQMHistoPlaquetteSummary2D(detid,"GainFitResult2d","Fit result for "+tempname);
486  bookkeeper_[detid]["endpoint_1d"]= bookDQMHistogram1D(detid,"GainEndPoint1d","point where fit meets ADC=255 for "+tempname,256,0.,256.*scalarVcalHigh_VcalLow_);
487  bookkeeper_[detid]["lowpoint_1d"]= bookDQMHistogram1D(detid,"GainLowPoint1d","lowest fit point for "+tempname,256,0.,256.*scalarVcalHigh_VcalLow_);
488  bookkeeper_[detid]["highpoint_1d"]= bookDQMHistogram1D(detid,"GainHighPoint1d","highest fit point for "+tempname,256,0.,256.*scalarVcalHigh_VcalLow_);
489  bookkeeper_[detid]["nfitpoints_1d"]= bookDQMHistogram1D(detid,"GainNPoints1d","number of fit point for "+tempname,20,0.,20);
490  bookkeeper_[detid]["dynamicrange_2d"]=bookDQMHistoPlaquetteSummary2D(detid,"GainDynamicRange2d","Difference lowest and highest points on gain curve for "+tempname);
491  bookkeeper_[detid]["lowpoint_2d"]=bookDQMHistoPlaquetteSummary2D(detid,"GainLowPoint2d","lowest fit point for "+tempname);
492  bookkeeper_[detid]["highpoint_2d"]=bookDQMHistoPlaquetteSummary2D(detid,"GainHighPoint2d","highest fit point for "+tempname);
493  bookkeeper_[detid]["plateau_2d"]=bookDQMHistoPlaquetteSummary2D(detid,"GainSaturate2d","Highest points on gain curve for "+tempname);
494 
495 }
496 //define this as a plug-in
std::map< uint32_t, std::map< std::string, MonitorElement * > > bookkeeper_pixels_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
static const double slope[3]
bool doFits(uint32_t detid, std::vector< SiPixelCalibDigi >::const_iterator ipix) override
std::string translateDetIdToString(uint32_t detid)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
SiPixelGainCalibrationAnalysis(const edm::ParameterSet &iConfig)
MonitorElement * bookDQMHistoPlaquetteSummary2D(uint32_t detid, std::string name, std::string title)
char const * label
bool isnan(float x)
Definition: math.h:13
T sqrt(T t)
Definition: SSEVec.h:18
void calibrationSetup(const edm::EventSetup &iSetup) override
MonitorElement * bookDQMHistogram1D(uint32_t detid, std::string name, std::string title, int nchX, double lowX, double highX)
T Abs(T a)
Definition: MathUtil.h:49
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static const int npoints
ii
Definition: cuy.py:590
std::map< uint32_t, std::map< std::string, MonitorElement * > > bookkeeper_
std::vector< float > CalculateAveragePerColumn(uint32_t detid, std::string label)
#define begin
Definition: vmac.h:32
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40