CMS 3D CMS Logo

HGCalRecHitValidation.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 
15 
17 
20 
29 
37 
38 #include "CLHEP/Units/GlobalSystemOfUnits.h"
39 #include "TVector3.h"
40 
42 
43 public:
44  struct energysum{
46  double e15, e25, e50, e100, e250, e1000;
47  };
48 
49  struct HitsInfo{
51  x=y=z=time=energy=phi=eta=0.0;
52  layer=0;
53  }
54  float x, y, z, time, energy, phi, eta ;
55  float layer;
56  };
57 
58 
60  ~HGCalRecHitValidation() override {}
61 
62  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
63  void dqmBeginRun(const edm::Run&, const edm::EventSetup&) override;
64  void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
65  void analyze(const edm::Event&, const edm::EventSetup&) override;
66 
67 private:
68  template<class T1, class T2>
69  void recHitValidation(DetId & detId, int layer, const T1* geom, T2 it);
70  void fillHitsInfo();
71  void fillHitsInfo(HitsInfo& hits);
72  void fillOccupancyMap(std::map<int, int>& OccupancyMap, int layer);
73 
74  // ----------member data ---------------------------
77  bool ifHCAL_;
79  unsigned int layers_;
80  std::map<int, int> OccupancyMap_plus;
81  std::map<int, int> OccupancyMap_minus;
82 
83  std::vector<MonitorElement*> EtaPhi_Plus_;
84  std::vector<MonitorElement*> EtaPhi_Minus_;
85  std::vector<MonitorElement*> energy_;
86  std::vector<MonitorElement*> HitOccupancy_Plus_;
87  std::vector<MonitorElement*> HitOccupancy_Minus_;
90 };
91 
93  nameDetector_(iConfig.getParameter<std::string>("DetectorName")),
94  ifHCAL_(iConfig.getParameter<bool>("ifHCAL")),
95  verbosity_(iConfig.getUntrackedParameter<int>("Verbosity",0)) {
96 
97  auto temp = iConfig.getParameter<edm::InputTag>("RecHitSource");
98  if (nameDetector_ == "HGCalEESensitive" ||
99  nameDetector_ == "HGCalHESiliconSensitive" ||
100  nameDetector_ == "HGCalHEScintillatorSensitive") {
101  recHitSource_ = consumes<HGCRecHitCollection>(temp);
102  } else if (nameDetector_ == "HCal") {
103  if (ifHCAL_) recHitSource_ = consumes<HBHERecHitCollection>(temp);
104  else recHitSource_ = consumes<HGChebRecHitCollection>(temp);
105  } else {
106  throw cms::Exception("BadHGCRecHitSource")
107  << "HGCal DetectorName given as " << nameDetector_ << " must be: "
108  << "\"HGCalHESiliconSensitive\", \"HGCalHESiliconSensitive\", "
109  << "\"HGCalHEScintillatorSensitive\", or \"HCal\"!";
110  }
111 }
112 
113 
116  desc.add<std::string>("DetectorName","HGCalEESensitive");
117  desc.add<edm::InputTag>("RecHitSource",edm::InputTag("HGCalRecHit","HGCEERecHits"));
118  desc.add<bool>("ifHCAL",false);
119  desc.addUntracked<int>("Verbosity",0);
120  descriptions.add("hgcalRecHitValidationEE",desc);
121 }
122 
124  const edm::EventSetup& iSetup) {
125  OccupancyMap_plus.clear();
126  OccupancyMap_minus.clear();
127 
128  bool ok(true);
129  unsigned int ntot(0), nused(0);
130  if (nameDetector_ == "HCal") {
132  iSetup.get<CaloGeometryRecord>().get(geom);
133  if (!geom.isValid())
134  edm::LogWarning("HGCalValidation") << "Cannot get valid HGCalGeometry "
135  << "Object for " << nameDetector_;
136  const CaloGeometry* geom0 = geom.product();
137 
138  if (ifHCAL_) {
140  iEvent.getByToken(recHitSource_, hbhecoll);
141  if (hbhecoll.isValid()) {
142  if (verbosity_>0)
143  edm::LogVerbatim("HGCalValidation") << nameDetector_ << " with "
144  << hbhecoll->size()
145  << " element(s)";
146  for (HBHERecHitCollection::const_iterator it=hbhecoll->begin();
147  it != hbhecoll->end(); ++it) {
148  DetId detId = it->id();
149  ntot++;
150  if (detId.subdetId() == HcalEndcap) {
151  nused++;
152  int layer = HcalDetId(detId).depth();
153  recHitValidation(detId, layer, geom0, it);
154  }
155  }
156  } else {
157  ok = false;
158  edm::LogWarning("HGCalValidation") << "HBHERecHitCollection Handle does not exist !!!";
159  }
160  } else {
162  iEvent.getByToken(recHitSource_, hbhecoll);
163  if (hbhecoll.isValid()) {
164  if (verbosity_>0)
165  edm::LogVerbatim("HGCalValidation") << nameDetector_ << " with "
166  << hbhecoll->size()
167  << " element(s)";
168  for (HGChebRecHitCollection::const_iterator it=hbhecoll->begin();
169  it != hbhecoll->end(); ++it) {
170  DetId detId = it->id();
171  ntot++; nused++;
172  int layer = HcalDetId(detId).depth();
173  recHitValidation(detId, layer, geom0, it);
174  }
175  } else {
176  ok = false;
177  edm::LogWarning("HGCalValidation") << "HGChebRecHitCollection Handle does not exist !!!";
178  }
179  }
180  } else {
182  iSetup.get<IdealGeometryRecord>().get(nameDetector_, geom);
183  if (!geom.isValid()) edm::LogWarning("HGCalValidation") << "Cannot get valid HGCalGeometry Object for " << nameDetector_;
184  const HGCalGeometry* geom0 = geom.product();
185 
186  edm::Handle<HGCRecHitCollection> theRecHitContainers;
187  iEvent.getByToken(recHitSource_, theRecHitContainers);
188  if (theRecHitContainers.isValid()) {
189  if (verbosity_>0)
190  edm::LogVerbatim("HGCalValidation") << nameDetector_ << " with "
191  << theRecHitContainers->size()
192  << " element(s)";
193  for (HGCRecHitCollection::const_iterator it=theRecHitContainers->begin();
194  it !=theRecHitContainers->end(); ++it) {
195  ntot++; nused++;
196  DetId detId = it->id();
197  int layer = (detId.subdetId() == HGCEE) ? (HGCEEDetId(detId).layer()) : (HGCHEDetId(detId).layer());
198  recHitValidation(detId, layer, geom0, it);
199  }
200  } else {
201  ok = false;
202  edm::LogWarning("HGCalValidation") << "HGCRecHitCollection Handle does not exist !!!";
203  }
204  }
205  if (ok) fillHitsInfo();
206  edm::LogVerbatim("HGCalValidation") << "Event " << iEvent.id().event()
207  << " with " << ntot << " total and "
208  << nused << " used recHits";
209 }
210 
211 template<class T1, class T2>
213  const T1* geom, T2 it) {
214 
215  const GlobalPoint& global = geom->getPosition(detId);
216  double energy = it->energy();
217 
218  float globalx = global.x();
219  float globaly = global.y();
220  float globalz = global.z();
221 
222  HitsInfo hinfo;
223  hinfo.energy = energy;
224  hinfo.x = globalx;
225  hinfo.y = globaly;
226  hinfo.z = globalz;
227  hinfo.layer = layer;
228  hinfo.phi = global.phi();
229  hinfo.eta = global.eta();
230 
231  if (verbosity_>1)
232  edm::LogVerbatim("HGCalValidation") << "-------------------------- gx = "
233  << globalx << " gy = " << globaly
234  << " gz = " << globalz << " phi = "
235  << hinfo.phi << " eta = " << hinfo.eta;
236 
237  fillHitsInfo(hinfo);
238 
239  if (hinfo.eta > 0) fillOccupancyMap(OccupancyMap_plus, layer -1);
240  else fillOccupancyMap(OccupancyMap_minus, layer -1);
241 
242 }
243 
244 void HGCalRecHitValidation::fillOccupancyMap(std::map<int, int>& OccupancyMap, int layer){
245  if (OccupancyMap.find(layer) != OccupancyMap.end()) OccupancyMap[layer]++;
246  else OccupancyMap[layer] = 1;
247 }
248 
250 
251  for (auto itr = OccupancyMap_plus.begin() ; itr != OccupancyMap_plus.end(); ++itr) {
252  int layer = (*itr).first;
253  int occupancy = (*itr).second;
254  HitOccupancy_Plus_.at(layer)->Fill(occupancy);
255  }
256 
257  for (auto itr = OccupancyMap_minus.begin() ; itr != OccupancyMap_minus.end(); ++itr) {
258  int layer = (*itr).first;
259  int occupancy = (*itr).second;
260  HitOccupancy_Minus_.at(layer)->Fill(occupancy);
261  }
262 
263 }
264 
266 
267  unsigned int ilayer = hits.layer -1;
268  energy_.at(ilayer)->Fill(hits.energy);
269 
270  EtaPhi_Plus_.at(ilayer)->Fill(hits.eta , hits.phi);
271  EtaPhi_Minus_.at(ilayer)->Fill(hits.eta, hits.phi);
272 
273 }
274 
276  const edm::EventSetup& iSetup) {
277 
278  if (nameDetector_ == "HCal") {
280  iSetup.get<HcalRecNumberingRecord>().get( pHRNDC );
281  const HcalDDDRecConstants *hcons = &(*pHRNDC);
282  layers_ = hcons->getMaxDepth(1);
283  } else {
285  iSetup.get<IdealGeometryRecord>().get(nameDetector_, pHGDC);
286  const HGCalDDDConstants & hgcons_ = (*pHGDC);
287  layers_ = hgcons_.layers(true);
288  }
289 }
290 
292  edm::Run const&,
293  edm::EventSetup const&) {
294 
295  iB.setCurrentFolder("HGCalRecHitsV/"+nameDetector_);
296  std::ostringstream histoname;
297  for (unsigned int ilayer = 0; ilayer < layers_; ilayer++ ) {
298  histoname.str(""); histoname << "HitOccupancy_Plus_layer_" << ilayer;
299  HitOccupancy_Plus_.push_back(iB.book1D( histoname.str().c_str(), "RecHitOccupancy_Plus", 100, 0, 10000));
300  histoname.str(""); histoname << "HitOccupancy_Minus_layer_" << ilayer;
301  HitOccupancy_Minus_.push_back(iB.book1D( histoname.str().c_str(), "RecHitOccupancy_Minus", 100, 0, 10000));
302 
303  histoname.str(""); histoname << "EtaPhi_Plus_" << "layer_" << ilayer;
304  EtaPhi_Plus_.push_back(iB.book2D(histoname.str().c_str(), "Occupancy", 31, 1.45, 3.0, 72, -CLHEP::pi, CLHEP::pi));
305  histoname.str(""); histoname << "EtaPhi_Minus_" << "layer_" << ilayer;
306  EtaPhi_Minus_.push_back(iB.book2D(histoname.str().c_str(), "Occupancy", 31, -3.0, -1.45, 72, -CLHEP::pi, CLHEP::pi));
307 
308  histoname.str(""); histoname << "energy_layer_" << ilayer;
309  energy_.push_back(iB.book1D(histoname.str().c_str(),"energy_",100,0,0.002));
310  }//loop over layers ends here
311 
312  histoname.str(""); histoname << "SUMOfRecHitOccupancy_Plus";
313  MeanHitOccupancy_Plus_= iB.book1D( histoname.str().c_str(), "SUMOfRecHitOccupancy_Plus", layers_, -0.5, layers_-0.5);
314  histoname.str(""); histoname << "SUMOfRecHitOccupancy_Minus";
315  MeanHitOccupancy_Minus_ = iB.book1D( histoname.str().c_str(), "SUMOfRecHitOccupancy_Minus", layers_, -0.5,layers_-0.5);
316 }
317 
318 
319 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
320 
322 
323 //define this as a plug-in
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
HGCalRecHitValidation(const edm::ParameterSet &)
std::vector< MonitorElement * > EtaPhi_Minus_
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:519
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
std::vector< HBHERecHit >::const_iterator const_iterator
T y() const
Definition: PV3DBase.h:63
std::vector< MonitorElement * > EtaPhi_Plus_
int layer() const
get the layer #
Definition: HGCHEDetId.h:50
std::vector< MonitorElement * > HitOccupancy_Minus_
const Double_t pi
MonitorElement * MeanHitOccupancy_Plus_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int depth() const
get the tower depth
Definition: HcalDetId.cc:108
int iEvent
Definition: GenABIO.cc:230
std::map< int, int > OccupancyMap_minus
unsigned int layers(bool reco) const
T z() const
Definition: PV3DBase.h:64
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:118
MonitorElement * MeanHitOccupancy_Minus_
ParameterDescriptionBase * add(U const &iLabel, T const &value)
bool isValid() const
Definition: HandleBase.h:74
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
void dqmBeginRun(const edm::Run &, const edm::EventSetup &) override
const_iterator end() const
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: DetId.h:18
int layer() const
get the layer #
Definition: HGCEEDetId.h:49
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:279
void fillOccupancyMap(std::map< int, int > &OccupancyMap, int layer)
void analyze(const edm::Event &, const edm::EventSetup &) override
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:136
int getMaxDepth(const int &type) const
const T & get() const
Definition: EventSetup.h:58
void add(std::string const &label, ParameterSetDescription const &psetDescription)
T eta() const
Definition: PV3DBase.h:76
std::map< int, int > OccupancyMap_plus
edm::EventID id() const
Definition: EventBase.h:60
size_type size() const
std::vector< MonitorElement * > HitOccupancy_Plus_
bool isValid() const
Definition: ESHandle.h:47
T x() const
Definition: PV3DBase.h:62
T const * product() const
Definition: ESHandle.h:86
void recHitValidation(DetId &detId, int layer, const T1 *geom, T2 it)
std::vector< MonitorElement * > energy_
const_iterator begin() const
Definition: Run.h:43