CMS 3D CMS Logo

HcalGeomCheck.cc
Go to the documentation of this file.
1 // system include files
2 #include <cmath>
3 #include <iostream>
4 #include <fstream>
5 #include <vector>
6 #include <map>
7 #include <string>
8 
10 
12 
22 
27 
30 
31 #include "CLHEP/Geometry/Point3D.h"
32 #include "CLHEP/Geometry/Transform3D.h"
33 #include "CLHEP/Geometry/Vector3D.h"
34 #include "CLHEP/Units/GlobalSystemOfUnits.h"
35 #include "CLHEP/Units/GlobalPhysicalConstants.h"
36 
37 #include "TH1D.h"
38 #include "TH2D.h"
39 
40 class HcalGeomCheck : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
41 public:
42  struct hitsinfo {
43  hitsinfo() { phi = eta = energy = time = 0.0; }
44  double phi, eta, energy, time;
45  };
46 
47  explicit HcalGeomCheck(const edm::ParameterSet&);
48  ~HcalGeomCheck() override = default;
49  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
50 
51 protected:
52  void beginJob() override;
53  void beginRun(edm::Run const&, edm::EventSetup const&) override;
54  void analyze(edm::Event const&, edm::EventSetup const&) override;
55  void endRun(edm::Run const&, edm::EventSetup const&) override {}
56 
57 private:
58  void analyzeHits(int, const std::string&, const std::vector<PCaloHit>&);
59 
60  // ----------member data ---------------------------
63  const double rmin_, rmax_, zmin_, zmax_;
64  const int nbinR_, nbinZ_, verbosity_;
68 
69  //histogram related stuff
70  TH2D* h_RZ_;
71  std::map<std::pair<int, int>, TH1D*> h_phi_;
72  std::map<int, TH1D*> h_eta_;
73  std::vector<TH1D*> h_E_, h_T_;
74 };
75 
77  : caloHitSource_(iConfig.getParameter<std::string>("caloHitSource")),
78  ietaMin_(iConfig.getUntrackedParameter<int>("ietaMin", -41)),
79  ietaMax_(iConfig.getUntrackedParameter<int>("ietaMax", 41)),
80  depthMax_(iConfig.getUntrackedParameter<int>("depthMax", 7)),
81  rmin_(iConfig.getUntrackedParameter<double>("rMin", 0.0)),
82  rmax_(iConfig.getUntrackedParameter<double>("rMax", 5500.0)),
83  zmin_(iConfig.getUntrackedParameter<double>("zMin", -12500.0)),
84  zmax_(iConfig.getUntrackedParameter<double>("zMax", 12500.0)),
85  nbinR_(iConfig.getUntrackedParameter<int>("nBinR", 550)),
86  nbinZ_(iConfig.getUntrackedParameter<int>("nBinZ", 2500)),
87  verbosity_(iConfig.getUntrackedParameter<int>("verbosity", 0)),
88  tok_hits_(consumes<edm::PCaloHitContainer>(edm::InputTag("g4SimHits", caloHitSource_))),
90  usesResource(TFileService::kSharedResource);
91 }
92 
95  desc.add<std::string>("caloHitSource", "HcalHits");
96  desc.addUntracked<int>("ietaMin", -41);
97  desc.addUntracked<int>("ietaMax", 41);
98  desc.addUntracked<int>("depthMax", 7);
99  desc.addUntracked<double>("rMin", 0.0);
100  desc.addUntracked<double>("rMax", 5500.0);
101  desc.addUntracked<double>("zMin", -12500.0);
102  desc.addUntracked<double>("zMax", 12500.0);
103  desc.addUntracked<int>("nBinR", 550);
104  desc.addUntracked<int>("nBinZ", 250);
105  desc.addUntracked<int>("verbosity", 0);
106  descriptions.add("hcalGeomCheck", desc);
107 }
108 
110  //Now the hits
111  const edm::Handle<edm::PCaloHitContainer>& theCaloHitContainer = iEvent.getHandle(tok_hits_);
112  if (theCaloHitContainer.isValid()) {
113  if (verbosity_ > 0)
114  edm::LogVerbatim("HcalValidation") << " PcalohitItr = " << theCaloHitContainer->size();
115 
116  //Merge hits for the same DetID
117  std::map<HcalDetId, hitsinfo> map_hits;
118  for (auto const& hit : *(theCaloHitContainer.product())) {
119  unsigned int id = hit.id();
121  double energy = hit.energy();
122  double time = hit.time();
123  int subdet = detId.subdet();
124  int ieta = detId.ieta();
125  int iphi = detId.iphi();
126  int depth = detId.depth();
127  std::pair<double, double> etaphi = hcons_->getEtaPhi(subdet, ieta, iphi);
128  double rz = hcons_->getRZ(subdet, ieta, depth);
129  if (verbosity_ > 2)
130  edm::LogVerbatim("HcalValidation") << "i/p " << subdet << ":" << ieta << ":" << iphi << ":" << depth << " o/p "
131  << etaphi.first << ":" << etaphi.second << ":" << rz;
132  HepGeom::Point3D<float> gcoord = HepGeom::Point3D<float>(rz * cos(etaphi.second) / cosh(etaphi.first),
133  rz * sin(etaphi.second) / cosh(etaphi.first),
134  rz * tanh(etaphi.first));
135  double tof = (gcoord.mag() * CLHEP::mm) / CLHEP::c_light;
136  if (verbosity_ > 1)
137  edm::LogVerbatim("HcalValidation")
138  << "Detector " << subdet << " ieta = " << ieta << " iphi = " << iphi << " depth = " << depth
139  << " positon = " << gcoord << " energy = " << energy << " time = " << time << ":" << tof;
140  time -= tof;
141  if (time < 0)
142  time = 0;
143  hitsinfo hinfo;
144  if (map_hits.count(detId) != 0) {
145  hinfo = map_hits[detId];
146  } else {
147  hinfo.phi = gcoord.getPhi();
148  hinfo.eta = gcoord.getEta();
149  hinfo.time = time;
150  }
151  hinfo.energy += energy;
152  map_hits[detId] = hinfo;
153 
154  h_RZ_->Fill(gcoord.z(), gcoord.rho());
155  }
156 
157  //Fill in histograms
158  for (auto const& hit : map_hits) {
159  hitsinfo hinfo = hit.second;
160  int subdet = hit.first.subdet();
161  if (subdet > 0 && subdet < static_cast<int>(h_E_.size())) {
162  int depth = hit.first.depth();
163  int ieta = hit.first.ieta();
164  int iphi = hit.first.iphi();
165  if (verbosity_ > 1)
166  edm::LogVerbatim("HGCalValidation")
167  << " ---------------------- eta = " << ieta << ":" << hinfo.eta << " phi = " << iphi << ":" << hinfo.phi
168  << " depth = " << depth << " E = " << hinfo.energy << " T = " << hinfo.time;
169  h_E_[subdet]->Fill(hinfo.energy);
170  h_T_[subdet]->Fill(hinfo.time);
171  auto itr1 = h_phi_.find(std::pair<int, int>(ieta, depth));
172  if (itr1 != h_phi_.end())
173  itr1->second->Fill(iphi);
174  auto itr2 = h_eta_.find(depth);
175  if (itr2 != h_eta_.end())
176  itr2->second->Fill(ieta);
177  }
178  }
179  } else if (verbosity_ > 0) {
180  edm::LogVerbatim("HcalValidation") << "PCaloHitContainer does not "
181  << "exist for HCAL";
182  }
183 }
184 
185 // ------------ method called when starting to processes a run ------------
186 void HcalGeomCheck::beginRun(const edm::Run&, const edm::EventSetup& iSetup) {
187  const auto& pHRNDC = iSetup.getData(tok_HRNDC_);
188  hcons_ = &pHRNDC;
189  if (verbosity_ > 0)
190  edm::LogVerbatim("HcalValidation") << "Obtain HcalDDDRecConstants from Event Setup";
191 }
192 
194  if (verbosity_ > 2)
195  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck:: Enter beginJob";
197  h_RZ_ = fs->make<TH2D>("RZ", "R vs Z", nbinZ_, zmin_, zmax_, nbinR_, rmin_, rmax_);
198  if (verbosity_ > 2)
199  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck: booked scatterplot RZ";
200  char name[20], title[100];
201  for (int depth = 1; depth < depthMax_; ++depth) {
202  for (int ieta = ietaMin_; ieta <= ietaMax_; ++ieta) {
203  sprintf(name, "phi%d%d", ieta, depth);
204  sprintf(title, "i#phi (i#eta = %d, depth = %d)", ieta, depth);
205  h_phi_[std::pair<int, int>(ieta, depth)] = fs->make<TH1D>(name, title, 400, -20, 380);
206  if (verbosity_ > 2)
207  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck: books " << title;
208  }
209  sprintf(name, "eta%d", depth);
210  sprintf(title, "i#eta (depth = %d)", depth);
211  h_eta_[depth] = fs->make<TH1D>(name, title, 100, -50, 50);
212  if (verbosity_ > 2)
213  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck: books " << title;
214  }
215 
216  std::vector<std::string> dets = {"HCAL", "HB", "HE", "HF", "HO"};
217  for (unsigned int ih = 0; ih < dets.size(); ++ih) {
218  sprintf(name, "E_%s", dets[ih].c_str());
219  sprintf(title, "Energy deposit in %s (MeV)", dets[ih].c_str());
220  h_E_.emplace_back(fs->make<TH1D>(name, title, 1000, 0.0, 1.0));
221  if (verbosity_ > 2)
222  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck: books " << title;
223  sprintf(name, "T_%s", dets[ih].c_str());
224  sprintf(title, "Time of hit in %s (ns)", dets[ih].c_str());
225  h_T_.emplace_back(fs->make<TH1D>(name, title, 1000, 0.0, 200.0));
226  if (verbosity_ > 2)
227  edm::LogVerbatim("HcalValidation") << "HcalGeomCheck: books " << title;
228  }
229 }
230 
232 //define this as a plug-in
std::pair< T, T > etaphi(T x, T y, T z)
Definition: FastMath.h:162
static const std::string kSharedResource
Definition: TFileService.h:76
Log< level::Info, true > LogVerbatim
const double rmax_
double getRZ(const int &subdet, const int &ieta, const int &depth) const
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
std::vector< PCaloHit > PCaloHitContainer
std::vector< TH1D * > h_T_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
void tanh(data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_in])
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
void beginJob() override
const int ietaMin_
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
T const * product() const
Definition: Handle.h:70
void beginRun(edm::Run const &, edm::EventSetup const &) override
~HcalGeomCheck() override=default
const HcalDDDRecConstants * hcons_
const int depthMax_
const int nbinR_
std::pair< double, double > getEtaPhi(const int &subdet, const int &ieta, const int &iphi) const
void analyze(edm::Event const &, edm::EventSetup const &) override
int iEvent
Definition: GenABIO.cc:224
const int ietaMax_
std::map< std::pair< int, int >, TH1D * > h_phi_
void analyzeHits(int, const std::string &, const std::vector< PCaloHit > &)
std::map< int, TH1D * > h_eta_
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
const edm::ESGetToken< HcalDDDRecConstants, HcalRecNumberingRecord > tok_HRNDC_
Transition
Definition: Transition.h:12
const double zmin_
std::vector< TH1D * > h_E_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void endRun(edm::Run const &, edm::EventSetup const &) override
DetId relabel(const uint32_t testId) const
unsigned int id
const int nbinZ_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
const edm::EDGetTokenT< edm::PCaloHitContainer > tok_hits_
const std::string caloHitSource_
bool isValid() const
Definition: HandleBase.h:70
HLT enums.
const double rmin_
const double zmax_
HcalGeomCheck(const edm::ParameterSet &)
Definition: Run.h:45
const int verbosity_