CMS 3D CMS Logo

SiStripGainsPCLHarvester.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 
4 // CMSSW includes
19 
20 // user include files
25 #include <iostream>
26 #include <sstream>
27 
28 //********************************************************************************//
30  : doStoreOnDB(false), GOOD(0), BAD(0), MASKED(0), NStripAPVs(0), NPixelDets(0) {
31  m_Record = ps.getUntrackedParameter<std::string>("Record", "SiStripApvGainRcd");
32  CalibrationLevel = ps.getUntrackedParameter<int>("CalibrationLevel", 0);
33  MinNrEntries = ps.getUntrackedParameter<double>("minNrEntries", 20);
34  m_DQMdir = ps.getUntrackedParameter<std::string>("DQMdir", "AlCaReco/SiStripGains");
35  m_calibrationMode = ps.getUntrackedParameter<std::string>("calibrationMode", "StdBunch");
36  tagCondition_NClusters = ps.getUntrackedParameter<double>("NClustersForTagProd", 2E8);
37  tagCondition_GoodFrac = ps.getUntrackedParameter<double>("GoodFracForTagProd", 0.95);
38  doChargeMonitorPerPlane = ps.getUntrackedParameter<bool>("doChargeMonitorPerPlane", false);
39  VChargeHisto = ps.getUntrackedParameter<std::vector<std::string>>("ChargeHisto");
40 
41  //Set the monitoring element tag and store
42  dqm_tag_.reserve(7);
43  dqm_tag_.clear();
44  dqm_tag_.push_back("StdBunch"); // statistic collection from Standard Collision Bunch @ 3.8 T
45  dqm_tag_.push_back("StdBunch0T"); // statistic collection from Standard Collision Bunch @ 0 T
46  dqm_tag_.push_back("AagBunch"); // statistic collection from First Collision After Abort Gap @ 3.8 T
47  dqm_tag_.push_back("AagBunch0T"); // statistic collection from First Collision After Abort Gap @ 0 T
48  dqm_tag_.push_back("IsoMuon"); // statistic collection from Isolated Muon @ 3.8 T
49  dqm_tag_.push_back("IsoMuon0T"); // statistic collection from Isolated Muon @ 0 T
50  dqm_tag_.push_back("Harvest"); // statistic collection: Harvest
51 
52  tTopoToken_ = esConsumes<edm::Transition::BeginRun>();
53  tkGeomToken_ = esConsumes<edm::Transition::BeginRun>();
54  gainToken_ = esConsumes<edm::Transition::BeginRun>();
55  qualityToken_ = esConsumes<edm::Transition::BeginRun>();
56 }
57 
58 //********************************************************************************//
59 // ------------ method called for each event ------------
61  using namespace edm;
62  static constexpr float defaultGainTick = 690. / 640.;
63 
64  this->checkBookAPVColls(iSetup); // check whether APV colls are booked and do so if not yet done
65  this->checkAndRetrieveTopology(iSetup);
66 
67  const auto gainHandle = iSetup.getHandle(gainToken_);
68  if (!gainHandle.isValid()) {
69  edm::LogError("SiStripGainPCLHarvester") << "gainHandle is not valid\n";
70  exit(0);
71  }
72 
73  const auto& stripQuality = iSetup.getData(qualityToken_);
74 
75  for (unsigned int a = 0; a < APVsCollOrdered.size(); a++) {
76  std::shared_ptr<stAPVGain> APV = APVsCollOrdered[a];
77 
79  continue;
80 
81  APV->isMasked = stripQuality.IsApvBad(APV->DetId, APV->APVId);
82 
83  if (gainHandle->getNumberOfTags() != 2) {
84  edm::LogError("SiStripGainPCLHarvester") << "NUMBER OF GAIN TAG IS EXPECTED TO BE 2\n";
85  fflush(stdout);
86  exit(0);
87  };
88  float newPreviousGain = gainHandle->getApvGain(APV->APVId, gainHandle->getRange(APV->DetId, 1), 1);
89  if (APV->PreviousGain != 1 and newPreviousGain != APV->PreviousGain)
90  edm::LogWarning("SiStripGainPCLHarvester") << "WARNING: ParticleGain in the global tag changed\n";
91  APV->PreviousGain = newPreviousGain;
92 
93  float newPreviousGainTick =
94  APV->isMasked ? defaultGainTick : gainHandle->getApvGain(APV->APVId, gainHandle->getRange(APV->DetId, 0), 0);
95  if (APV->PreviousGainTick != 1 and newPreviousGainTick != APV->PreviousGainTick) {
96  edm::LogWarning("SiStripGainPCLHarvester")
97  << "WARNING: TickMarkGain in the global tag changed\n"
98  << std::endl
99  << " APV->SubDet: " << APV->SubDet << " APV->APVId:" << APV->APVId << std::endl
100  << " APV->PreviousGainTick: " << APV->PreviousGainTick << " newPreviousGainTick: " << newPreviousGainTick
101  << std::endl;
102  }
103  APV->PreviousGainTick = newPreviousGainTick;
104  }
105 }
106 
107 //********************************************************************************//
109  edm::LogInfo("SiStripGainsPCLHarvester") << "Starting harvesting statistics" << std::endl;
110 
111  std::string DQM_dir = m_DQMdir;
112 
113  std::string stag = *(std::find(dqm_tag_.begin(), dqm_tag_.end(), m_calibrationMode));
114  if (!stag.empty() && stag[0] != '_')
115  stag.insert(0, 1, '_');
116 
117  std::string cvi = DQM_dir + std::string("/Charge_Vs_Index") + stag;
118 
119  MonitorElement* Charge_Vs_Index = igetter_.get(cvi);
120 
121  if (Charge_Vs_Index == nullptr) {
122  edm::LogError("SiStripGainsPCLHarvester")
123  << "Harvesting: could not retrieve " << cvi.c_str() << ", statistics will not be summed!" << std::endl;
124  } else {
125  edm::LogInfo("SiStripGainsPCLHarvester")
126  << "Harvesting " << (Charge_Vs_Index)->getTH2S()->GetEntries() << " more clusters" << std::endl;
127  }
128 
129  algoComputeMPVandGain(Charge_Vs_Index);
130  std::unique_ptr<SiStripApvGain> theAPVGains = this->getNewObject(Charge_Vs_Index);
131 
132  // write out the APVGains record
134 
135  if (doStoreOnDB) {
136  if (poolDbService.isAvailable())
137  poolDbService->writeOne(theAPVGains.get(), poolDbService->currentTime(), m_Record);
138  else
139  throw std::runtime_error("PoolDBService required.");
140  } else {
141  edm::LogInfo("SiStripGainsPCLHarvester") << "Will not produce payload!" << std::endl;
142  }
143 
144  //Collect the statistics for monitoring and validation
145  gainQualityMonitor(ibooker_, Charge_Vs_Index);
146 }
147 
148 //********************************************************************************//
150  const MonitorElement* Charge_Vs_Index) const {
151  ibooker_.setCurrentFolder("AlCaReco/SiStripGainsHarvesting/");
152 
153  std::vector<APVGain::APVmon> new_charge_histos;
154  std::vector<std::pair<std::string, std::string>> cnames =
156  for (unsigned int i = 0; i < cnames.size(); i++) {
157  MonitorElement* monitor = ibooker_.book1DD((cnames[i]).first, (cnames[i]).second.c_str(), 100, 0., 1000.);
158  int thick = APVGain::thickness((cnames[i]).first);
159  int id = APVGain::subdetectorId((cnames[i]).first);
160  int side = APVGain::subdetectorSide((cnames[i]).first);
161  int plane = APVGain::subdetectorPlane((cnames[i]).first);
162  new_charge_histos.push_back(APVGain::APVmon(thick, id, side, plane, monitor));
163  }
164 
165  int MPVbin = 300;
166  float MPVmin = 0.;
167  float MPVmax = 600.;
168 
169  MonitorElement* MPV_Vs_EtaTIB =
170  ibooker_.book2DD("MPVvsEtaTIB", "MPV vs Eta TIB", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
171  MonitorElement* MPV_Vs_EtaTID =
172  ibooker_.book2DD("MPVvsEtaTID", "MPV vs Eta TID", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
173  MonitorElement* MPV_Vs_EtaTOB =
174  ibooker_.book2DD("MPVvsEtaTOB", "MPV vs Eta TOB", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
175  MonitorElement* MPV_Vs_EtaTEC =
176  ibooker_.book2DD("MPVvsEtaTEC", "MPV vs Eta TEC", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
177  MonitorElement* MPV_Vs_EtaTECthin =
178  ibooker_.book2DD("MPVvsEtaTEC1", "MPV vs Eta TEC-thin", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
179  MonitorElement* MPV_Vs_EtaTECthick =
180  ibooker_.book2DD("MPVvsEtaTEC2", "MPV vs Eta TEC-thick", 50, -3.0, 3.0, MPVbin, MPVmin, MPVmax);
181 
182  MonitorElement* MPV_Vs_PhiTIB =
183  ibooker_.book2DD("MPVvsPhiTIB", "MPV vs Phi TIB", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
184  MonitorElement* MPV_Vs_PhiTID =
185  ibooker_.book2DD("MPVvsPhiTID", "MPV vs Phi TID", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
186  MonitorElement* MPV_Vs_PhiTOB =
187  ibooker_.book2DD("MPVvsPhiTOB", "MPV vs Phi TOB", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
188  MonitorElement* MPV_Vs_PhiTEC =
189  ibooker_.book2DD("MPVvsPhiTEC", "MPV vs Phi TEC", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
190  MonitorElement* MPV_Vs_PhiTECthin =
191  ibooker_.book2DD("MPVvsPhiTEC1", "MPV vs Phi TEC-thin ", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
192  MonitorElement* MPV_Vs_PhiTECthick =
193  ibooker_.book2DD("MPVvsPhiTEC2", "MPV vs Phi TEC-thick", 50, -3.4, 3.4, MPVbin, MPVmin, MPVmax);
194 
195  MonitorElement* NoMPVfit = ibooker_.book2DD("NoMPVfit", "Modules with bad Landau Fit", 350, -350, 350, 240, 0, 120);
196  MonitorElement* NoMPVmasked = ibooker_.book2DD("NoMPVmasked", "Masked Modules", 350, -350, 350, 240, 0, 120);
197 
198  MonitorElement* Gains = ibooker_.book1DD("Gains", "Gains", 300, 0, 2);
199  MonitorElement* MPVs = ibooker_.book1DD("MPVs", "MPVs", MPVbin, MPVmin, MPVmax);
200  MonitorElement* MPVs320 = ibooker_.book1DD("MPV_320", "MPV 320 thickness", MPVbin, MPVmin, MPVmax);
201  MonitorElement* MPVs500 = ibooker_.book1DD("MPV_500", "MPV 500 thickness", MPVbin, MPVmin, MPVmax);
202  MonitorElement* MPVsTIB = ibooker_.book1DD("MPV_TIB", "MPV TIB", MPVbin, MPVmin, MPVmax);
203  MonitorElement* MPVsTID = ibooker_.book1DD("MPV_TID", "MPV TID", MPVbin, MPVmin, MPVmax);
204  MonitorElement* MPVsTIDP = ibooker_.book1DD("MPV_TIDP", "MPV TIDP", MPVbin, MPVmin, MPVmax);
205  MonitorElement* MPVsTIDM = ibooker_.book1DD("MPV_TIDM", "MPV TIDM", MPVbin, MPVmin, MPVmax);
206  MonitorElement* MPVsTOB = ibooker_.book1DD("MPV_TOB", "MPV TOB", MPVbin, MPVmin, MPVmax);
207  MonitorElement* MPVsTEC = ibooker_.book1DD("MPV_TEC", "MPV TEC", MPVbin, MPVmin, MPVmax);
208  MonitorElement* MPVsTECP = ibooker_.book1DD("MPV_TECP", "MPV TECP", MPVbin, MPVmin, MPVmax);
209  MonitorElement* MPVsTECM = ibooker_.book1DD("MPV_TECM", "MPV TECM", MPVbin, MPVmin, MPVmax);
210  MonitorElement* MPVsTECthin = ibooker_.book1DD("MPV_TEC1", "MPV TEC thin", MPVbin, MPVmin, MPVmax);
211  MonitorElement* MPVsTECthick = ibooker_.book1DD("MPV_TEC2", "MPV TEC thick", MPVbin, MPVmin, MPVmax);
212  MonitorElement* MPVsTECP1 = ibooker_.book1DD("MPV_TECP1", "MPV TECP thin ", MPVbin, MPVmin, MPVmax);
213  MonitorElement* MPVsTECP2 = ibooker_.book1DD("MPV_TECP2", "MPV TECP thick", MPVbin, MPVmin, MPVmax);
214  MonitorElement* MPVsTECM1 = ibooker_.book1DD("MPV_TECM1", "MPV TECM thin", MPVbin, MPVmin, MPVmax);
215  MonitorElement* MPVsTECM2 = ibooker_.book1DD("MPV_TECM2", "MPV TECM thick", MPVbin, MPVmin, MPVmax);
216 
217  MonitorElement* MPVError = ibooker_.book1DD("MPVError", "MPV Error", 150, 0, 150);
218  MonitorElement* MPVErrorVsMPV = ibooker_.book2DD("MPVErrorVsMPV", "MPV Error vs MPV", 300, 0, 600, 150, 0, 150);
219  MonitorElement* MPVErrorVsEta = ibooker_.book2DD("MPVErrorVsEta", "MPV Error vs Eta", 50, -3.0, 3.0, 150, 0, 150);
220  MonitorElement* MPVErrorVsPhi = ibooker_.book2DD("MPVErrorVsPhi", "MPV Error vs Phi", 50, -3.4, 3.4, 150, 0, 150);
221  MonitorElement* MPVErrorVsN = ibooker_.book2DD("MPVErrorVsN", "MPV Error vs N", 500, 0, 1000, 150, 0, 150);
222 
223  MonitorElement* DiffWRTPrevGainTIB = ibooker_.book1DD("DiffWRTPrevGainTIB", "Diff w.r.t. PrevGain TIB", 250, 0, 2);
224  MonitorElement* DiffWRTPrevGainTID = ibooker_.book1DD("DiffWRTPrevGainTID", "Diff w.r.t. PrevGain TID", 250, 0, 2);
225  MonitorElement* DiffWRTPrevGainTOB = ibooker_.book1DD("DiffWRTPrevGainTOB", "Diff w.r.t. PrevGain TOB", 250, 0, 2);
226  MonitorElement* DiffWRTPrevGainTEC = ibooker_.book1DD("DiffWRTPrevGainTEC", "Diff w.r.t. PrevGain TEC", 250, 0, 2);
227 
228  MonitorElement* GainVsPrevGainTIB =
229  ibooker_.book2DD("GainVsPrevGainTIB", "Gain vs PrevGain TIB", 100, 0, 2, 100, 0, 2);
230  MonitorElement* GainVsPrevGainTID =
231  ibooker_.book2DD("GainVsPrevGainTID", "Gain vs PrevGain TID", 100, 0, 2, 100, 0, 2);
232  MonitorElement* GainVsPrevGainTOB =
233  ibooker_.book2DD("GainVsPrevGainTOB", "Gain vs PrevGain TOB", 100, 0, 2, 100, 0, 2);
234  MonitorElement* GainVsPrevGainTEC =
235  ibooker_.book2DD("GainVsPrevGainTEC", "Gain vs PrevGain TEC", 100, 0, 2, 100, 0, 2);
236 
237  for (unsigned int a = 0; a < APVsCollOrdered.size(); a++) {
238  std::shared_ptr<stAPVGain> APV = APVsCollOrdered[a];
239  if (APV == nullptr)
240  continue;
241 
242  unsigned int Index = APV->Index;
243  unsigned int SubDet = APV->SubDet;
244  unsigned int DetId = APV->DetId;
245  float z = APV->z;
246  float Eta = APV->Eta;
247  float R = APV->R;
248  float Phi = APV->Phi;
249  float Thickness = APV->Thickness;
250  double FitMPV = APV->FitMPV;
251  double FitMPVErr = APV->FitMPVErr;
252  double Gain = APV->Gain;
253  double NEntries = APV->NEntries;
254  double PreviousGain = APV->PreviousGain;
255 
256  if (SubDet < 3)
257  continue; // avoid to loop over Pixel det id
258 
259  if (Gain != 1.) {
260  std::vector<MonitorElement*> charge_histos = APVGain::FetchMonitor(new_charge_histos, DetId, tTopo_);
261  TH2S* chvsidx = (Charge_Vs_Index)->getTH2S();
262  int bin = chvsidx->GetXaxis()->FindBin(Index);
263  TH1D* Proj = chvsidx->ProjectionY("proj", bin, bin);
264  for (int binId = 0; binId < Proj->GetXaxis()->GetNbins(); binId++) {
265  double new_charge = Proj->GetXaxis()->GetBinCenter(binId) / Gain;
266  if (Proj->GetBinContent(binId) != 0.) {
267  for (unsigned int h = 0; h < charge_histos.size(); h++) {
268  TH1D* chisto = (charge_histos[h])->getTH1D();
269  for (int e = 0; e < Proj->GetBinContent(binId); e++)
270  chisto->Fill(new_charge);
271  }
272  }
273  }
274  }
275 
276  if (FitMPV <= 0.) { // No fit of MPV
277  if (APV->isMasked)
278  NoMPVmasked->Fill(z, R);
279  else
280  NoMPVfit->Fill(z, R);
281 
282  } else { // Fit of MPV
283  if (FitMPV > 0.)
284  Gains->Fill(Gain);
285 
286  MPVs->Fill(FitMPV);
287  if (Thickness < 0.04)
288  MPVs320->Fill(FitMPV);
289  if (Thickness > 0.04)
290  MPVs500->Fill(FitMPV);
291 
292  MPVError->Fill(FitMPVErr);
293  MPVErrorVsMPV->Fill(FitMPV, FitMPVErr);
294  MPVErrorVsEta->Fill(Eta, FitMPVErr);
295  MPVErrorVsPhi->Fill(Phi, FitMPVErr);
296  MPVErrorVsN->Fill(NEntries, FitMPVErr);
297 
298  if (SubDet == 3) {
299  MPV_Vs_EtaTIB->Fill(Eta, FitMPV);
300  MPV_Vs_PhiTIB->Fill(Phi, FitMPV);
301  MPVsTIB->Fill(FitMPV);
302 
303  } else if (SubDet == 4) {
304  MPV_Vs_EtaTID->Fill(Eta, FitMPV);
305  MPV_Vs_PhiTID->Fill(Phi, FitMPV);
306  MPVsTID->Fill(FitMPV);
307  if (Eta < 0.)
308  MPVsTIDM->Fill(FitMPV);
309  if (Eta > 0.)
310  MPVsTIDP->Fill(FitMPV);
311 
312  } else if (SubDet == 5) {
313  MPV_Vs_EtaTOB->Fill(Eta, FitMPV);
314  MPV_Vs_PhiTOB->Fill(Phi, FitMPV);
315  MPVsTOB->Fill(FitMPV);
316 
317  } else if (SubDet == 6) {
318  MPV_Vs_EtaTEC->Fill(Eta, FitMPV);
319  MPV_Vs_PhiTEC->Fill(Phi, FitMPV);
320  MPVsTEC->Fill(FitMPV);
321  if (Eta < 0.)
322  MPVsTECM->Fill(FitMPV);
323  if (Eta > 0.)
324  MPVsTECP->Fill(FitMPV);
325  if (Thickness < 0.04) {
326  MPV_Vs_EtaTECthin->Fill(Eta, FitMPV);
327  MPV_Vs_PhiTECthin->Fill(Phi, FitMPV);
328  MPVsTECthin->Fill(FitMPV);
329  if (Eta > 0.)
330  MPVsTECP1->Fill(FitMPV);
331  if (Eta < 0.)
332  MPVsTECM1->Fill(FitMPV);
333  }
334  if (Thickness > 0.04) {
335  MPV_Vs_EtaTECthick->Fill(Eta, FitMPV);
336  MPV_Vs_PhiTECthick->Fill(Phi, FitMPV);
337  MPVsTECthick->Fill(FitMPV);
338  if (Eta > 0.)
339  MPVsTECP2->Fill(FitMPV);
340  if (Eta < 0.)
341  MPVsTECM2->Fill(FitMPV);
342  }
343  }
344  }
345 
346  if (SubDet == 3 && PreviousGain != 0.)
347  DiffWRTPrevGainTIB->Fill(Gain / PreviousGain);
348  else if (SubDet == 4 && PreviousGain != 0.)
349  DiffWRTPrevGainTID->Fill(Gain / PreviousGain);
350  else if (SubDet == 5 && PreviousGain != 0.)
351  DiffWRTPrevGainTOB->Fill(Gain / PreviousGain);
352  else if (SubDet == 6 && PreviousGain != 0.)
353  DiffWRTPrevGainTEC->Fill(Gain / PreviousGain);
354 
355  if (SubDet == 3)
356  GainVsPrevGainTIB->Fill(PreviousGain, Gain);
357  else if (SubDet == 4)
358  GainVsPrevGainTID->Fill(PreviousGain, Gain);
359  else if (SubDet == 5)
360  GainVsPrevGainTOB->Fill(PreviousGain, Gain);
361  else if (SubDet == 6)
362  GainVsPrevGainTEC->Fill(PreviousGain, Gain);
363  }
364 }
365 
366 //********************************************************************************//
368  unsigned int I = 0;
369  TH1F* Proj = nullptr;
370  double FitResults[6];
371  double MPVmean = 300;
372 
373  if (Charge_Vs_Index == nullptr) {
374  edm::LogError("SiStripGainsPCLHarvester")
375  << "Harvesting: could not execute algoComputeMPVandGain method because " << m_calibrationMode
376  << " statistics cannot be retrieved.\n"
377  << "Please check if input contains " << m_calibrationMode << " data." << std::endl;
378  return;
379  }
380 
381  TH2S* chvsidx = (Charge_Vs_Index)->getTH2S();
382 
383  printf("Progressing Bar :0%% 20%% 40%% 60%% 80%% 100%%\n");
384  printf("Fitting Charge Distribution :");
385  int TreeStep = APVsColl.size() / 50;
386 
387  for (auto it = APVsColl.begin(); it != APVsColl.end(); it++, I++) {
388  if (I % TreeStep == 0) {
389  printf(".");
390  fflush(stdout);
391  }
392  std::shared_ptr<stAPVGain> APV = it->second;
393  if (APV->Bin < 0)
394  APV->Bin = chvsidx->GetXaxis()->FindBin(APV->Index);
395 
396  if (APV->isMasked) {
397  APV->Gain = APV->PreviousGain;
398  MASKED++;
399  continue;
400  }
401 
402  Proj = (TH1F*)(chvsidx->ProjectionY(
403  "", chvsidx->GetXaxis()->FindBin(APV->Index), chvsidx->GetXaxis()->FindBin(APV->Index), "e"));
404  if (!Proj)
405  continue;
406 
407  if (CalibrationLevel == 0) {
408  } else if (CalibrationLevel == 1) {
409  int SecondAPVId = APV->APVId;
410  if (SecondAPVId % 2 == 0) {
411  SecondAPVId = SecondAPVId + 1;
412  } else {
413  SecondAPVId = SecondAPVId - 1;
414  }
415  std::shared_ptr<stAPVGain> APV2 = APVsColl[(APV->DetId << 4) | SecondAPVId];
416  if (APV2->Bin < 0)
417  APV2->Bin = chvsidx->GetXaxis()->FindBin(APV2->Index);
418  TH1F* Proj2 = (TH1F*)(chvsidx->ProjectionY("", APV2->Bin, APV2->Bin, "e"));
419  if (Proj2) {
420  Proj->Add(Proj2, 1);
421  delete Proj2;
422  }
423  } else if (CalibrationLevel == 2) {
424  for (unsigned int i = 0; i < 16; i++) { //loop up to 6APV for Strip and up to 16 for Pixels
425  auto tmpit = APVsColl.find((APV->DetId << 4) | i);
426  if (tmpit == APVsColl.end())
427  continue;
428  std::shared_ptr<stAPVGain> APV2 = tmpit->second;
429  if (APV2->DetId != APV->DetId || APV2->APVId == APV->APVId)
430  continue;
431  if (APV2->Bin < 0)
432  APV2->Bin = chvsidx->GetXaxis()->FindBin(APV2->Index);
433  TH1F* Proj2 = (TH1F*)(chvsidx->ProjectionY("", APV2->Bin, APV2->Bin, "e"));
434  if (Proj2) {
435  Proj->Add(Proj2, 1);
436  delete Proj2;
437  }
438  }
439  } else {
440  CalibrationLevel = 0;
441  printf("Unknown Calibration Level, will assume %i\n", CalibrationLevel);
442  }
443 
444  getPeakOfLandau(Proj, FitResults);
445  APV->FitMPV = FitResults[0];
446  APV->FitMPVErr = FitResults[1];
447  APV->FitWidth = FitResults[2];
448  APV->FitWidthErr = FitResults[3];
449  APV->FitChi2 = FitResults[4];
450  APV->FitNorm = FitResults[5];
451  APV->NEntries = Proj->GetEntries();
452 
453  if (IsGoodLandauFit(FitResults)) {
454  APV->Gain = APV->FitMPV / MPVmean;
455  if (APV->SubDet > 2)
456  GOOD++;
457  } else {
458  APV->Gain = APV->PreviousGain;
459  if (APV->SubDet > 2)
460  BAD++;
461  }
462  if (APV->Gain <= 0)
463  APV->Gain = 1;
464 
465  delete Proj;
466  }
467  printf("\n");
468 }
469 
470 //********************************************************************************//
471 void SiStripGainsPCLHarvester::getPeakOfLandau(TH1* InputHisto, double* FitResults, double LowRange, double HighRange) {
472  FitResults[0] = -0.5; //MPV
473  FitResults[1] = 0; //MPV error
474  FitResults[2] = -0.5; //Width
475  FitResults[3] = 0; //Width error
476  FitResults[4] = -0.5; //Fit Chi2/NDF
477  FitResults[5] = 0; //Normalization
478 
479  if (InputHisto->GetEntries() < MinNrEntries)
480  return;
481 
482  // perform fit with standard landau
483  TF1 MyLandau("MyLandau", "landau", LowRange, HighRange);
484  MyLandau.SetParameter(1, 300);
485  InputHisto->Fit(&MyLandau, "0QR WW");
486 
487  // MPV is parameter 1 (0=constant, 1=MPV, 2=Sigma)
488  FitResults[0] = MyLandau.GetParameter(1); //MPV
489  FitResults[1] = MyLandau.GetParError(1); //MPV error
490  FitResults[2] = MyLandau.GetParameter(2); //Width
491  FitResults[3] = MyLandau.GetParError(2); //Width error
492  FitResults[4] = MyLandau.GetChisquare() / MyLandau.GetNDF(); //Fit Chi2/NDF
493  FitResults[5] = MyLandau.GetParameter(0);
494 }
495 
496 //********************************************************************************//
498  if (FitResults[0] <= 0)
499  return false;
500  // if(FitResults[1] > MaxMPVError )return false;
501  // if(FitResults[4] > MaxChi2OverNDF)return false;
502  return true;
503 }
504 
505 //********************************************************************************//
506 // ------------ method called once each job just before starting event loop ------------
508  auto newBareTkGeomPtr = &es.getData(tkGeomToken_);
509  if (newBareTkGeomPtr == bareTkGeomPtr_)
510  return; // already filled APVColls, nothing changed
511 
512  if (!bareTkGeomPtr_) { // pointer not yet set: called the first time => fill the APVColls
513  auto const& Det = newBareTkGeomPtr->dets();
514 
515  unsigned int Index = 0;
516 
517  for (unsigned int i = 0; i < Det.size(); i++) {
518  DetId Detid = Det[i]->geographicalId();
519  int SubDet = Detid.subdetId();
520 
523  auto DetUnit = dynamic_cast<const StripGeomDetUnit*>(Det[i]);
524  if (!DetUnit)
525  continue;
526 
527  const StripTopology& Topo = DetUnit->specificTopology();
528  unsigned int NAPV = Topo.nstrips() / 128;
529 
530  for (unsigned int j = 0; j < NAPV; j++) {
531  auto APV = std::make_shared<stAPVGain>();
532  APV->Index = Index;
533  APV->Bin = -1;
534  APV->DetId = Detid.rawId();
535  APV->APVId = j;
536  APV->SubDet = SubDet;
537  APV->FitMPV = -1;
538  APV->FitMPVErr = -1;
539  APV->FitWidth = -1;
540  APV->FitWidthErr = -1;
541  APV->FitChi2 = -1;
542  APV->FitNorm = -1;
543  APV->Gain = -1;
544  APV->PreviousGain = 1;
545  APV->PreviousGainTick = 1;
546  APV->x = DetUnit->position().basicVector().x();
547  APV->y = DetUnit->position().basicVector().y();
548  APV->z = DetUnit->position().basicVector().z();
549  APV->Eta = DetUnit->position().basicVector().eta();
550  APV->Phi = DetUnit->position().basicVector().phi();
551  APV->R = DetUnit->position().basicVector().transverse();
552  APV->Thickness = DetUnit->surface().bounds().thickness();
553  APV->NEntries = 0;
554  APV->isMasked = false;
555 
556  APVsCollOrdered.push_back(APV);
557  APVsColl[(APV->DetId << 4) | APV->APVId] = APV;
558  Index++;
559  NStripAPVs++;
560  } // loop on APVs
561  } // if is Strips
562  } // loop on dets
563 
564  for (unsigned int i = 0; i < Det.size();
565  i++) { //Make two loop such that the Pixel information is added at the end --> make transition simpler
566  DetId Detid = Det[i]->geographicalId();
567  int SubDet = Detid.subdetId();
569  auto DetUnit = dynamic_cast<const PixelGeomDetUnit*>(Det[i]);
570  if (!DetUnit)
571  continue;
572 
573  const PixelTopology& Topo = DetUnit->specificTopology();
574  unsigned int NROCRow = Topo.nrows() / (80.);
575  unsigned int NROCCol = Topo.ncolumns() / (52.);
576 
577  for (unsigned int j = 0; j < NROCRow; j++) {
578  for (unsigned int i = 0; i < NROCCol; i++) {
579  auto APV = std::make_shared<stAPVGain>();
580  APV->Index = Index;
581  APV->Bin = -1;
582  APV->DetId = Detid.rawId();
583  APV->APVId = (j << 3 | i);
584  APV->SubDet = SubDet;
585  APV->FitMPV = -1;
586  APV->FitMPVErr = -1;
587  APV->FitWidth = -1;
588  APV->FitWidthErr = -1;
589  APV->FitChi2 = -1;
590  APV->Gain = -1;
591  APV->PreviousGain = 1;
592  APV->PreviousGainTick = 1;
593  APV->x = DetUnit->position().basicVector().x();
594  APV->y = DetUnit->position().basicVector().y();
595  APV->z = DetUnit->position().basicVector().z();
596  APV->Eta = DetUnit->position().basicVector().eta();
597  APV->Phi = DetUnit->position().basicVector().phi();
598  APV->R = DetUnit->position().basicVector().transverse();
599  APV->Thickness = DetUnit->surface().bounds().thickness();
600  APV->isMasked = false; //SiPixelQuality_->IsModuleBad(Detid.rawId());
601  APV->NEntries = 0;
602 
603  APVsCollOrdered.push_back(APV);
604  APVsColl[(APV->DetId << 4) | APV->APVId] = APV;
605  Index++;
606  NPixelDets++;
607 
608  } // loop on ROC cols
609  } // loop on ROC rows
610  } // if Pixel
611  } // loop on Dets
612  } //if (!bareTkGeomPtr_) ...
613  bareTkGeomPtr_ = newBareTkGeomPtr;
614 }
615 
617  if (!tTopo_) {
618  tTopo_ = &setup.getData(tTopoToken_);
619  }
620 }
621 
622 //********************************************************************************//
624  // The goal of this function is to check wether or not there is enough statistics
625  // to produce a meaningful tag for the DB
626 
627  if (Charge_Vs_Index == nullptr) {
628  edm::LogError("SiStripGainsPCLHarvester")
629  << "produceTagFilter -> Return false: could not retrieve the " << m_calibrationMode << " statistics.\n"
630  << "Please check if input contains " << m_calibrationMode << " data." << std::endl;
631  return false;
632  }
633 
634  float integral = (Charge_Vs_Index)->getTH2S()->Integral();
635  if ((Charge_Vs_Index)->getTH2S()->Integral(0, NStripAPVs + 1, 0, 99999) < tagCondition_NClusters) {
636  edm::LogWarning("SiStripGainsPCLHarvester")
637  << "calibrationMode -> " << m_calibrationMode << "\n"
638  << "produceTagFilter -> Return false: Statistics is too low : " << integral << std::endl;
639  return false;
640  }
641  if ((1.0 * GOOD) / (GOOD + BAD) < tagCondition_GoodFrac) {
642  edm::LogWarning("SiStripGainsPCLHarvester")
643  << "calibrationMode -> " << m_calibrationMode << "\n"
644  << "produceTagFilter -> Return false: ratio of GOOD/TOTAL is too low: " << (1.0 * GOOD) / (GOOD + BAD)
645  << std::endl;
646  return false;
647  }
648  return true;
649 }
650 
651 //********************************************************************************//
652 std::unique_ptr<SiStripApvGain> SiStripGainsPCLHarvester::getNewObject(const MonitorElement* Charge_Vs_Index) {
653  std::unique_ptr<SiStripApvGain> obj = std::make_unique<SiStripApvGain>();
654 
655  if (!produceTagFilter(Charge_Vs_Index)) {
656  edm::LogWarning("SiStripGainsPCLHarvester")
657  << "getNewObject -> will not produce a paylaod because produceTagFilter returned false " << std::endl;
658  return obj;
659  } else {
660  doStoreOnDB = true;
661  }
662 
663  std::vector<float> theSiStripVector;
664  unsigned int PreviousDetId = 0;
665  for (unsigned int a = 0; a < APVsCollOrdered.size(); a++) {
666  std::shared_ptr<stAPVGain> APV = APVsCollOrdered[a];
667  if (APV == nullptr) {
668  printf("Bug\n");
669  continue;
670  }
671  if (APV->SubDet <= 2)
672  continue;
673  if (APV->DetId != PreviousDetId) {
674  if (!theSiStripVector.empty()) {
675  SiStripApvGain::Range range(theSiStripVector.begin(), theSiStripVector.end());
676  if (!obj->put(PreviousDetId, range))
677  printf("Bug to put detId = %i\n", PreviousDetId);
678  }
679  theSiStripVector.clear();
680  PreviousDetId = APV->DetId;
681  }
682  theSiStripVector.push_back(APV->Gain);
683 
684  LogDebug("SiStripGainsPCLHarvester") << " DetId: " << APV->DetId << " APV: " << APV->APVId
685  << " Gain: " << APV->Gain << std::endl;
686  }
687  if (!theSiStripVector.empty()) {
688  SiStripApvGain::Range range(theSiStripVector.begin(), theSiStripVector.end());
689  if (!obj->put(PreviousDetId, range))
690  printf("Bug to put detId = %i\n", PreviousDetId);
691  }
692 
693  return obj;
694 }
695 
696 //********************************************************************************//
697 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
700  desc.setUnknown();
701  descriptions.addDefault(desc);
702 }
703 
704 //********************************************************************************//
SiStripGainsPCLHarvester::gainQualityMonitor
void gainQualityMonitor(DQMStore::IBooker &ibooker_, const MonitorElement *Charge_Vs_Index) const
Definition: SiStripGainsPCLHarvester.cc:149
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
mps_fire.i
i
Definition: mps_fire.py:428
SiStripGainsPCLHarvester::tTopo_
const TrackerTopology * tTopo_
Definition: SiStripGainsPCLHarvester.h:97
StripGeomDetUnit.h
funct::false
false
Definition: Factorize.h:29
PixelSubdetector::PixelEndcap
Definition: PixelSubdetector.h:11
SiStripGainsPCLHarvester::dqm_tag_
std::vector< std::string > dqm_tag_
Definition: SiStripGainsPCLHarvester.h:92
PixelSubdetector::PixelBarrel
Definition: PixelSubdetector.h:11
SiStripGainsPCLHarvester::beginRun
void beginRun(edm::Run const &run, edm::EventSetup const &isetup) override
Definition: SiStripGainsPCLHarvester.cc:60
SiStripGainsPCLHarvester::m_calibrationMode
std::string m_calibrationMode
Definition: SiStripGainsPCLHarvester.h:89
SiStripGainsPCLHarvester::produceTagFilter
bool produceTagFilter(const MonitorElement *Charge_Vs_Index)
Definition: SiStripGainsPCLHarvester.cc:623
edm::Run
Definition: Run.h:45
SiStripGainsPCLHarvester::MASKED
unsigned int MASKED
Definition: SiStripGainsPCLHarvester.h:77
edm
HLT enums.
Definition: AlignableModifier.h:19
cscdqm::MASKED
Data available (reporting)
Definition: CSCDQM_Summary.h:48
h
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
Definition: L1TUtmAlgorithmRcd.h:4
SiStripGainsPCLHarvester::APVsColl
std::unordered_map< unsigned int, std::shared_ptr< stAPVGain > > APVsColl
Definition: SiStripGainsPCLHarvester.h:100
SiStripGainsPCLHarvester::bareTkGeomPtr_
const TrackerGeometry * bareTkGeomPtr_
Definition: SiStripGainsPCLHarvester.h:96
SiStripGainsPCLHarvester::endRun
void endRun(edm::Run const &run, edm::EventSetup const &isetup) override
Definition: SiStripGainsPCLHarvester.cc:705
SiStripGainsPCLHarvester::SiStripGainsPCLHarvester
SiStripGainsPCLHarvester(const edm::ParameterSet &ps)
Definition: SiStripGainsPCLHarvester.cc:29
hcaldqm::constants::GOOD
const double GOOD
Definition: Constants.h:13
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
dqm::implementation::NavigatorBase::setCurrentFolder
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
SiStripGainsPCLHarvester::tkGeomToken_
edm::ESGetToken< TrackerGeometry, TrackerDigiGeometryRecord > tkGeomToken_
Definition: SiStripGainsPCLHarvester.h:103
SiStripGainsPCLHarvester::NStripAPVs
int NStripAPVs
Definition: SiStripGainsPCLHarvester.h:82
SiStripGainsPCLHarvester::APVsCollOrdered
std::vector< std::shared_ptr< stAPVGain > > APVsCollOrdered
Definition: SiStripGainsPCLHarvester.h:99
edm::second
U second(std::pair< T, U > const &p)
Definition: ParameterSet.cc:222
TrackingGeometry.h
dqm::legacy::MonitorElement
Definition: MonitorElement.h:462
IntegrityClient_cfi.Gain
Gain
Definition: IntegrityClient_cfi.py:16
APVGain::APVmon
Definition: APVGainHelpers.h:30
edm::ParameterSet::getUntrackedParameter
T getUntrackedParameter(std::string const &, T const &) const
edm::LogInfo
Log< level::Info, false > LogInfo
Definition: MessageLogger.h:125
APVGain::subdetectorPlane
int subdetectorPlane(uint32_t, const TrackerTopology *)
Definition: APVGainHelpers.cc:119
SiStripGainsPCLHarvester::tagCondition_NClusters
double tagCondition_NClusters
Definition: SiStripGainsPCLHarvester.h:79
SiStripGainsPCLHarvester::NPixelDets
int NPixelDets
Definition: SiStripGainsPCLHarvester.h:83
spr::find
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
SiStripGainsPCLHarvester::qualityToken_
edm::ESGetToken< SiStripQuality, SiStripQualityRcd > qualityToken_
Definition: SiStripGainsPCLHarvester.h:105
edm::Service::isAvailable
bool isAvailable() const
Definition: Service.h:40
SiStripGainsPCLHarvester::MinNrEntries
double MinNrEntries
Definition: SiStripGainsPCLHarvester.h:84
edm::LogWarning
Log< level::Warning, false > LogWarning
Definition: MessageLogger.h:122
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
DetId
Definition: DetId.h:17
PoolDBOutputService.h
h
Track.h
TrackFwd.h
SiStripGainsPCLHarvester::BAD
unsigned int BAD
Definition: SiStripGainsPCLHarvester.h:76
Exhume::I
const std::complex< double > I
Definition: I.h:8
SiStripGainsPCLHarvester.h
funct::integral
Integral< F, X >::type integral(const F &f)
Definition: Integral.h:70
ntupleEnum.SubDet
SubDet
Definition: ntupleEnum.py:15
SiStripGainsPCLHarvester::tTopoToken_
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
Definition: SiStripGainsPCLHarvester.h:102
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
SiStripGainsPCLHarvester::VChargeHisto
std::vector< std::string > VChargeHisto
Definition: SiStripGainsPCLHarvester.h:90
DDAxes::z
PixelTopology::ncolumns
virtual int ncolumns() const =0
StripSubdetector::TIB
static constexpr auto TIB
Definition: StripSubdetector.h:16
VtxSmearedParameters_cfi.Phi
Phi
Definition: VtxSmearedParameters_cfi.py:112
SiStripGainsPCLHarvester::getPeakOfLandau
void getPeakOfLandau(TH1 *InputHisto, double *FitResults, double LowRange=50, double HighRange=5400)
Definition: SiStripGainsPCLHarvester.cc:471
SiStripGainsPCLHarvester::checkAndRetrieveTopology
virtual void checkAndRetrieveTopology(const edm::EventSetup &setup)
Definition: SiStripGainsPCLHarvester.cc:616
SiStripApvGain.h
SiPixelRecHit.h
PixelTopology
Definition: PixelTopology.h:10
first
auto first
Definition: CAHitNtupletGeneratorKernelsImpl.h:112
getGTfromDQMFile.obj
obj
Definition: getGTfromDQMFile.py:32
DetId::subdetId
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum)
Definition: DetId.h:48
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
dqm::implementation::IBooker::book1DD
MonitorElement * book1DD(TString const &name, TString const &title, int nchX, double lowX, double highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:155
SiStripGainsPCLHarvester::getNewObject
std::unique_ptr< SiStripApvGain > getNewObject(const MonitorElement *Charge_Vs_Index)
Definition: SiStripGainsPCLHarvester.cc:652
dqm::implementation::IBooker::book2DD
MonitorElement * book2DD(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:261
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
edm::ParameterSet
Definition: ParameterSet.h:47
a
double a
Definition: hdecay.h:119
APVGain::subdetectorSide
int subdetectorSide(uint32_t, const TrackerTopology *)
Definition: APVGainHelpers.cc:49
SiStripGainsPCLHarvester::checkBookAPVColls
virtual void checkBookAPVColls(const edm::EventSetup &setup)
Definition: SiStripGainsPCLHarvester.cc:507
mps_setup.stdout
stdout
Definition: mps_setup.py:250
beam_dqm_sourceclient-live_cfg.monitor
monitor
Definition: beam_dqm_sourceclient-live_cfg.py:242
APVGain::FetchMonitor
std::vector< MonitorElement * > FetchMonitor(std::vector< APVmon >, uint32_t, const TrackerTopology *topo=nullptr)
Definition: APVGainHelpers.cc:151
SiStripGainsPCLHarvester::CalibrationLevel
int CalibrationLevel
Definition: SiStripGainsPCLHarvester.h:94
sistrip::APV
Definition: ConstantsForGranularity.h:79
edm::Service< cond::service::PoolDBOutputService >
SiStripGainsPCLHarvester::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: SiStripGainsPCLHarvester.cc:698
edm::EventSetup::getHandle
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:155
SiStripGainsPCLHarvester::gainToken_
edm::ESGetToken< SiStripGain, SiStripGainRcd > gainToken_
Definition: SiStripGainsPCLHarvester.h:104
edm::EventSetup
Definition: EventSetup.h:58
APVGain::thickness
int thickness(uint32_t)
Definition: APVGainHelpers.cc:76
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
GeometricDet.h
StripTopology::nstrips
virtual int nstrips() const =0
SiStripGainsPCLHarvester::doStoreOnDB
bool doStoreOnDB
Definition: SiStripGainsPCLHarvester.h:73
edm::EventSetup::getData
bool getData(T &iHolder) const
Definition: EventSetup.h:127
SiStripRecHit1D.h
newFWLiteAna.bin
bin
Definition: newFWLiteAna.py:161
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
writedatasetfile.run
run
Definition: writedatasetfile.py:27
StripSubdetector::TEC
static constexpr auto TEC
Definition: StripSubdetector.h:19
SiStripGainsPCLHarvester::m_DQMdir
std::string m_DQMdir
Definition: SiStripGainsPCLHarvester.h:88
DetId.h
dqm::implementation::IGetter
Definition: DQMStore.h:484
SiStripApvGain::Range
std::pair< ContainerIterator, ContainerIterator > Range
Definition: SiStripApvGain.h:28
cond::service::PoolDBOutputService::writeOne
Hash writeOne(const T *payload, Time_t time, const std::string &recordName)
Definition: PoolDBOutputService.h:63
SiStripGainsPCLHarvester::IsGoodLandauFit
bool IsGoodLandauFit(double *FitResults)
Definition: SiStripGainsPCLHarvester.cc:497
PixelGeomDetUnit.h
StripSubdetector::TOB
static constexpr auto TOB
Definition: StripSubdetector.h:18
dqm::implementation::IGetter::get
virtual MonitorElement * get(std::string const &fullpath) const
Definition: DQMStore.cc:651
SiStripGainsPCLHarvester::algoComputeMPVandGain
void algoComputeMPVandGain(const MonitorElement *Charge_Vs_Index)
Definition: SiStripGainsPCLHarvester.cc:367
EventSetup.h
dqm::implementation::IBooker
Definition: DQMStore.h:43
APVGain::monHnames
std::vector< std::pair< std::string, std::string > > monHnames(std::vector< std::string >, bool, const char *tag)
Definition: APVGainHelpers.cc:215
hcaldqm::constants::BAD
const double BAD
Definition: Constants.h:15
SiStripGainsPCLHarvester::doChargeMonitorPerPlane
bool doChargeMonitorPerPlane
Definition: SiStripGainsPCLHarvester.h:74
SiStripGainsPCLHarvester::dqmEndJob
void dqmEndJob(DQMStore::IBooker &ibooker_, DQMStore::IGetter &igetter_) override
Definition: SiStripGainsPCLHarvester.cc:108
beamvalidation.exit
def exit(msg="")
Definition: beamvalidation.py:53
GeometricSearchDet
Definition: GeometricSearchDet.h:17
SiStripMatchedRecHit2D.h
SiStripGainsPCLHarvester::m_Record
std::string m_Record
Definition: SiStripGainsPCLHarvester.h:86
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
SiStripClusterCollection.h
PixelTopology::nrows
virtual int nrows() const =0
edm::ConfigurationDescriptions::addDefault
void addDefault(ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:99
SiStripGainsPCLHarvester::tagCondition_GoodFrac
double tagCondition_GoodFrac
Definition: SiStripGainsPCLHarvester.h:80
APVGainHelpers.h
SiStripGainsPCLHarvester::GOOD
unsigned int GOOD
Definition: SiStripGainsPCLHarvester.h:75
dttmaxenums::R
Definition: DTTMax.h:29
SiStripRecHit2D.h
StripTopology
Definition: StripTopology.h:11
StripSubdetector.h
cond::service::PoolDBOutputService::currentTime
cond::Time_t currentTime() const
Definition: PoolDBOutputService.cc:217
StripSubdetector::TID
static constexpr auto TID
Definition: StripSubdetector.h:17
APVGain::subdetectorId
int subdetectorId(uint32_t)
Definition: APVGainHelpers.cc:16
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37