CMS 3D CMS Logo

HGCalDigiValidation.cc
Go to the documentation of this file.
1 // system include files
2 #include <cmath>
3 #include <fstream>
4 #include <iostream>
5 #include <map>
6 #include <string>
7 #include <vector>
8 
14 
26 
28 
31 
41 
49 
50 #include "CLHEP/Units/GlobalSystemOfUnits.h"
51 
52 // user include files
53 
55 public:
56  struct digiInfo {
58  x = y = z = charge = 0.0;
59  layer = adc = 0;
60  mode = threshold = false;
61  }
62  double x, y, z, charge;
63  int layer, adc;
64  bool mode, threshold; //tot mode and zero supression
65  };
66 
67  explicit HGCalDigiValidation(const edm::ParameterSet&);
68  ~HGCalDigiValidation() override {}
69 
70  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
71  void dqmBeginRun(const edm::Run&, const edm::EventSetup&) override;
72  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
73  void analyze(const edm::Event&, const edm::EventSetup&) override;
74 
75 private:
77  void fillDigiInfo();
78  void fillOccupancyMap(std::map<int, int>& OccupancyMap, int layer);
79  template <class T1, class T2>
80  void digiValidation(
81  const T1& detId, const T2* geom, int layer, uint16_t adc, double charge, bool mode, bool threshold);
82 
83  // ----------member data ---------------------------
89 
90  std::map<int, int> OccupancyMap_plus_;
91  std::map<int, int> OccupancyMap_minus_;
92 
93  std::vector<MonitorElement*> TOA_;
94  std::vector<MonitorElement*> DigiOccupancy_XY_;
95  std::vector<MonitorElement*> ADC_;
96  std::vector<MonitorElement*> TOT_;
97  std::vector<MonitorElement*> DigiOccupancy_Plus_;
98  std::vector<MonitorElement*> DigiOccupancy_Minus_;
101 };
102 
104  : nameDetector_(iConfig.getParameter<std::string>("DetectorName")),
105  ifNose_(iConfig.getParameter<bool>("ifNose")),
106  ifHCAL_(iConfig.getParameter<bool>("ifHCAL")),
107  verbosity_(iConfig.getUntrackedParameter<int>("Verbosity", 0)),
108  SampleIndx_(iConfig.getUntrackedParameter<int>("SampleIndx", 0)),
109  firstLayer_(1) {
110  auto temp = iConfig.getParameter<edm::InputTag>("DigiSource");
111  if ((nameDetector_ == "HGCalEESensitive") || (nameDetector_ == "HGCalHESiliconSensitive") ||
112  (nameDetector_ == "HGCalHEScintillatorSensitive") || (nameDetector_ == "HGCalHFNoseSensitive")) {
113  digiSource_ = consumes<HGCalDigiCollection>(temp);
114  } else if (nameDetector_ == "HCal") {
115  if (ifHCAL_)
116  digiSource_ = consumes<QIE11DigiCollection>(temp);
117  else
118  digiSource_ = consumes<HGCalDigiCollection>(temp);
119  } else {
120  throw cms::Exception("BadHGCDigiSource") << "HGCal DetectorName given as " << nameDetector_ << " must be: "
121  << "\"HGCalEESensitive\", \"HGCalHESiliconSensitive\", "
122  << "\"HGCalHEScintillatorSensitive\", \"HGCalHFNoseSensitive\", "
123  << "or \"HCal\"!";
124  }
125 }
126 
129  desc.add<std::string>("DetectorName", "HGCalEESensitive");
130  desc.add<edm::InputTag>("DigiSource", edm::InputTag("hgcalDigis", "EE"));
131  desc.add<bool>("ifNose", false);
132  desc.add<bool>("ifHCAL", false);
133  desc.addUntracked<int>("Verbosity", 0);
134  desc.addUntracked<int>("SampleIndx", 2); // central bx
135  descriptions.add("hgcalDigiValidationEEDefault", desc);
136 }
137 
139  OccupancyMap_plus_.clear();
140  OccupancyMap_minus_.clear();
141 
142  const HGCalGeometry* geom0(nullptr);
143  const CaloGeometry* geom1(nullptr);
144  int geomType(0);
145  if (nameDetector_ == "HCal") {
147  iSetup.get<CaloGeometryRecord>().get(geom);
148  if (!geom.isValid())
149  edm::LogVerbatim("HGCalValidation") << "HGCalDigiValidation: Cannot get "
150  << "valid Geometry Object for " << nameDetector_;
151  geom1 = geom.product();
152  } else {
154  iSetup.get<IdealGeometryRecord>().get(nameDetector_, geom);
155  if (!geom.isValid())
156  edm::LogVerbatim("HGCalValidation") << "HGCalDigiValidation: Cannot get "
157  << "valid Geometry Object for " << nameDetector_;
158  geom0 = geom.product();
161  geomType = 1;
162  else if (mode == HGCalGeometryMode::Trapezoid)
163  geomType = 2;
164  if (nameDetector_ == "HGCalHFNoseSensitive")
165  geomType = 3;
166  }
167 
168  unsigned int ntot(0), nused(0);
169  if ((nameDetector_ == "HGCalEESensitive") || (nameDetector_ == "HGCalHFNoseSensitive")) {
170  //HGCalEE
171  edm::Handle<HGCalDigiCollection> theHGCEEDigiContainers;
172  iEvent.getByToken(digiSource_, theHGCEEDigiContainers);
173  if (theHGCEEDigiContainers.isValid()) {
174  if (verbosity_ > 0)
175  edm::LogVerbatim("HGCalValidation")
176  << nameDetector_ << " with " << theHGCEEDigiContainers->size() << " element(s)";
177  for (const auto& it : *(theHGCEEDigiContainers.product())) {
178  ntot++;
179  nused++;
180  DetId detId = it.id();
181  int layer = ((geomType == 0) ? HGCalDetId(detId).layer()
182  : (geomType == 1) ? HGCSiliconDetId(detId).layer() : HFNoseDetId(detId).layer());
183  const HGCSample& hgcSample = it.sample(SampleIndx_);
184  uint16_t gain = hgcSample.toa();
185  uint16_t adc = hgcSample.data();
186  double charge = gain;
187  bool totmode = hgcSample.mode();
188  bool zerothreshold = hgcSample.threshold();
189  digiValidation(detId, geom0, layer, adc, charge, totmode, zerothreshold);
190  }
191  fillDigiInfo();
192  } else {
193  edm::LogVerbatim("HGCalValidation") << "DigiCollection handle does not "
194  << "exist for " << nameDetector_;
195  }
196  } else if ((nameDetector_ == "HGCalHESiliconSensitive") || (nameDetector_ == "HGCalHEScintillatorSensitive")) {
197  //HGCalHE
198  edm::Handle<HGCalDigiCollection> theHGCHEDigiContainers;
199  iEvent.getByToken(digiSource_, theHGCHEDigiContainers);
200  if (theHGCHEDigiContainers.isValid()) {
201  if (verbosity_ > 0)
202  edm::LogVerbatim("HGCalValidation")
203  << nameDetector_ << " with " << theHGCHEDigiContainers->size() << " element(s)";
204  for (const auto& it : *(theHGCHEDigiContainers.product())) {
205  ntot++;
206  nused++;
207  DetId detId = it.id();
208  int layer = ((geomType == 0)
209  ? HGCalDetId(detId).layer()
210  : ((geomType == 1) ? HGCSiliconDetId(detId).layer() : HGCScintillatorDetId(detId).layer()));
211  const HGCSample& hgcSample = it.sample(SampleIndx_);
212  uint16_t gain = hgcSample.toa();
213  uint16_t adc = hgcSample.data();
214  double charge = gain;
215  bool totmode = hgcSample.mode();
216  bool zerothreshold = hgcSample.threshold();
217  digiValidation(detId, geom0, layer, adc, charge, totmode, zerothreshold);
218  }
219  fillDigiInfo();
220  } else {
221  edm::LogVerbatim("HGCalValidation") << "DigiCollection handle does not "
222  << "exist for " << nameDetector_;
223  }
224  } else if ((nameDetector_ == "HCal") && (!ifHCAL_)) {
225  //HGCalBH
226  edm::Handle<HGCalDigiCollection> theHGCBHDigiContainers;
227  iEvent.getByToken(digiSource_, theHGCBHDigiContainers);
228  if (theHGCBHDigiContainers.isValid()) {
229  if (verbosity_ > 0)
230  edm::LogVerbatim("HGCalValidation")
231  << nameDetector_ << " with " << theHGCBHDigiContainers->size() << " element(s)";
232  for (const auto& it : *(theHGCBHDigiContainers.product())) {
233  ntot++;
234  nused++;
235  HcalDetId detId = it.id();
236  int layer = detId.depth();
237  const HGCSample& hgcSample = it.sample(SampleIndx_);
238  uint16_t gain = hgcSample.toa();
239  uint16_t adc = hgcSample.data();
240  double charge = gain;
241  bool totmode = hgcSample.mode();
242  bool zerothreshold = hgcSample.threshold();
243  digiValidation(detId, geom1, layer, adc, charge, totmode, zerothreshold);
244  }
245  fillDigiInfo();
246  } else {
247  edm::LogWarning("HGCalValidation") << "DigiCollection handle does not "
248  << "exist for " << nameDetector_;
249  }
250  } else if (nameDetector_ == "HCal") {
251  //HE
252  edm::Handle<QIE11DigiCollection> theHEDigiContainers;
253  iEvent.getByToken(digiSource_, theHEDigiContainers);
254  if (theHEDigiContainers.isValid()) {
255  if (verbosity_ > 0)
256  edm::LogVerbatim("HGCalValidation")
257  << nameDetector_ << " with " << theHEDigiContainers->size() << " element(s)";
258  edm::ESHandle<HcalDbService> conditions;
259  iSetup.get<HcalDbRecord>().get(conditions);
260 
261  for (const auto& it : *(theHEDigiContainers.product())) {
262  QIE11DataFrame df(it);
263  HcalDetId detId = (df.id());
264  ntot++;
265  if (detId.subdet() == HcalEndcap) {
266  nused++;
268  const HcalQIECoder* channelCoder = conditions->getHcalCoder(detId);
269  const HcalQIEShape* shape = conditions->getHcalShape(channelCoder);
270  HcalCoderDb coder(*channelCoder, *shape);
271  CaloSamples tool;
272  coder.adc2fC(df, tool);
273  int layer = detId.depth();
274  uint16_t adc = (df)[SampleIndx_].adc();
275  int capid = (df)[SampleIndx_].capid();
276  double charge = (tool[SampleIndx_] - calibrations.pedestal(capid));
277  bool totmode = false;
278  bool zerothreshold = false;
279  digiValidation(detId, geom1, layer, adc, charge, totmode, zerothreshold);
280  }
281  }
282  fillDigiInfo();
283  } else {
284  edm::LogWarning("HGCalValidation") << "DigiCollection handle does not "
285  << "exist for " << nameDetector_;
286  }
287  } else {
288  edm::LogWarning("HGCalValidation") << "invalid detector name !! " << nameDetector_;
289  }
290  if (verbosity_ > 0)
291  edm::LogVerbatim("HGCalValidation") << "Event " << iEvent.id().event() << " with " << ntot << " total and " << nused
292  << " used digis";
293 }
294 
295 template <class T1, class T2>
297  const T1& detId, const T2* geom, int layer, uint16_t adc, double charge, bool mode, bool threshold) {
298  if (verbosity_ > 1)
299  edm::LogVerbatim("HGCalValidation") << std::hex << detId.rawId() << std::dec << " " << detId.rawId();
300  DetId id1 = DetId(detId.rawId());
301  const GlobalPoint& global1 = geom->getPosition(id1);
302 
303  if (verbosity_ > 1)
304  edm::LogVerbatim("HGCalValidation") << " adc = " << adc << " toa = " << charge;
305 
306  digiInfo hinfo;
307  hinfo.x = global1.x();
308  hinfo.y = global1.y();
309  hinfo.z = global1.z();
310  hinfo.adc = adc;
311  hinfo.charge = charge;
312  hinfo.layer = layer - firstLayer_;
313  hinfo.mode = mode;
314  hinfo.threshold = threshold;
315 
316  if (verbosity_ > 1)
317  edm::LogVerbatim("HGCalValidation") << "gx = " << hinfo.x << " gy = " << hinfo.y << " gz = " << hinfo.z;
318 
319  if (global1.eta() > 0)
321  else
323 
324  fillDigiInfo(hinfo);
325 }
326 
327 void HGCalDigiValidation::fillOccupancyMap(std::map<int, int>& OccupancyMap, int layer) {
328  if (OccupancyMap.find(layer) != OccupancyMap.end())
329  OccupancyMap[layer]++;
330  else
331  OccupancyMap[layer] = 1;
332 }
333 
335  int ilayer = hinfo.layer;
336  TOA_.at(ilayer)->Fill(hinfo.charge);
337 
338  if (hinfo.mode) {
339  TOT_.at(ilayer)->Fill(hinfo.adc);
340  }
341 
342  if (!hinfo.mode && hinfo.threshold) {
343  ADC_.at(ilayer)->Fill(hinfo.adc);
344  DigiOccupancy_XY_.at(ilayer)->Fill(hinfo.x, hinfo.y);
345  }
346 }
347 
349  for (const auto& itr : OccupancyMap_plus_) {
350  int layer = itr.first;
351  int occupancy = itr.second;
352  DigiOccupancy_Plus_.at(layer)->Fill(occupancy);
353  }
354  for (const auto& itr : OccupancyMap_minus_) {
355  int layer = itr.first;
356  int occupancy = itr.second;
357  DigiOccupancy_Minus_.at(layer)->Fill(occupancy);
358  }
359 }
360 
362  if (nameDetector_ == "HCal") {
364  iSetup.get<HcalRecNumberingRecord>().get(pHRNDC);
365  const HcalDDDRecConstants* hcons = &(*pHRNDC);
366  layers_ = hcons->getMaxDepth(1);
367  } else {
369  iSetup.get<IdealGeometryRecord>().get(nameDetector_, pHGDC);
370  const HGCalDDDConstants& hgcons_ = (*pHGDC);
371  layers_ = hgcons_.layers(true);
372  firstLayer_ = hgcons_.firstLayer();
373  }
374 
375  if (verbosity_ > 0)
376  edm::LogVerbatim("HGCalValidation") << "current DQM directory: "
377  << "HGCAL/HGCalDigisV/" << nameDetector_ << " layer = " << layers_
378  << " with the first one at " << firstLayer_;
379 }
380 
382  iB.setCurrentFolder("HGCAL/HGCalDigisV/" + nameDetector_);
383 
384  std::ostringstream histoname;
385  for (int il = 0; il < layers_; ++il) {
386  int ilayer = firstLayer_ + il;
387  auto istr1 = std::to_string(ilayer);
388  while (istr1.size() < 2) {
389  istr1.insert(0, "0");
390  }
391  histoname.str("");
392  histoname << "TOA_"
393  << "layer_" << istr1;
394  TOA_.push_back(iB.book1D(histoname.str().c_str(), "toa_", 1024, 0, 1024));
395 
396  histoname.str("");
397  histoname << "ADC_"
398  << "layer_" << istr1;
399  ADC_.push_back(iB.book1D(histoname.str().c_str(), "ADCDigiOccupancy", 1024, 0, 1024));
400 
401  histoname.str("");
402  histoname << "TOT_"
403  << "layer_" << istr1;
404  TOT_.push_back(iB.book1D(histoname.str().c_str(), "TOTDigiOccupancy", 4096, 0, 4096));
405 
406  histoname.str("");
407  histoname << "DigiOccupancy_XY_"
408  << "layer_" << istr1;
409  DigiOccupancy_XY_.push_back(iB.book2D(histoname.str().c_str(), "DigiOccupancy", 50, -500, 500, 50, -500, 500));
410 
411  histoname.str("");
412  histoname << "DigiOccupancy_Plus_"
413  << "layer_" << istr1;
414  DigiOccupancy_Plus_.push_back(iB.book1D(histoname.str().c_str(), "DigiOccupancy +z", 100, 0, 1000));
415  histoname.str("");
416  histoname << "DigiOccupancy_Minus_"
417  << "layer_" << istr1;
418  DigiOccupancy_Minus_.push_back(iB.book1D(histoname.str().c_str(), "DigiOccupancy -z", 100, 0, 1000));
419  }
420 
421  histoname.str("");
422  histoname << "SUMOfDigiOccupancy_Plus";
423  MeanDigiOccupancy_Plus_ = iB.book1D(histoname.str().c_str(), "SUMOfDigiOccupancy_Plus", layers_, -0.5, layers_ - 0.5);
424  histoname.str("");
425  histoname << "SUMOfRecDigiOccupancy_Minus";
427  iB.book1D(histoname.str().c_str(), "SUMOfDigiOccupancy_Minus", layers_, -0.5, layers_ - 0.5);
428 }
429 
430 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
431 
433 
434 //define this as a plug-in
HGCalGeometryMode::GeometryMode geomMode() const
Geometry mode.
Definition: HGCalTopology.h:79
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:40
void analyze(const edm::Event &, const edm::EventSetup &) override
bool mode() const
Definition: HGCSample.h:67
uint16_t toa() const
Definition: HGCSample.h:69
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
std::vector< MonitorElement * > TOA_
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
std::vector< MonitorElement * > DigiOccupancy_XY_
std::vector< MonitorElement * > TOT_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
wrapper for a data word
Definition: HGCSample.h:13
void dqmBeginRun(const edm::Run &, const edm::EventSetup &) override
void adc2fC(const HBHEDataFrame &df, CaloSamples &lf) const override
Definition: HcalCoderDb.cc:73
int depth() const
get the tower depth
Definition: HcalDetId.h:164
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
unsigned int layers(bool reco) const
bool threshold() const
Definition: HGCSample.h:66
int layer() const
get the layer #
Definition: HFNoseDetId.h:55
int layer() const
get the layer #
const HGCalTopology & topology() const
edm::DataFrame::id_type id() const
HGCalDigiValidation(const edm::ParameterSet &)
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:70
std::vector< MonitorElement * > DigiOccupancy_Minus_
Definition: DetId.h:17
constexpr double pedestal(int fCapId) const
get pedestal for capid=0..3
T const * product() const
Definition: Handle.h:69
int getMaxDepth(const int &type) const
MonitorElement * MeanDigiOccupancy_Minus_
const HcalQIECoder * getHcalCoder(const HcalGenericDetId &fId) const
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void digiValidation(const T1 &detId, const T2 *geom, int layer, uint16_t adc, double charge, bool mode, bool threshold)
edm::EDGetToken digiSource_
const HcalQIEShape * getHcalShape(const HcalGenericDetId &fId) const
std::map< int, int > OccupancyMap_minus_
int layer() const
get the layer #
std::map< int, int > OccupancyMap_plus_
edm::EventID id() const
Definition: EventBase.h:59
size_type size() const
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
T get() const
Definition: EventSetup.h:73
int firstLayer() const
bool isValid() const
Definition: ESHandle.h:44
const HcalCalibrations & getHcalCalibrations(const HcalGenericDetId &fId) const
std::vector< MonitorElement * > ADC_
MonitorElement * MeanDigiOccupancy_Plus_
uint16_t data() const
Definition: HGCSample.h:70
T const * product() const
Definition: ESHandle.h:86
void fillOccupancyMap(std::map< int, int > &OccupancyMap, int layer)
int layer() const
get the layer #
Definition: HGCalDetId.h:46
std::vector< MonitorElement * > DigiOccupancy_Plus_
Definition: Run.h:45