CMS 3D CMS Logo

HcalRecHitsDQMClient.cc
Go to the documentation of this file.
3 
8 
10 
12  outputFile_ = iConfig.getUntrackedParameter<std::string>("outputFile", "myfile.root");
13  debug_ = false;
14  verbose_ = false;
15  dirName_ = iConfig.getParameter<std::string>("DQMDirName");
16 }
17 
19 
21 
24  es.get<HcalRecNumberingRecord>().get(pHRNDC);
25  hcons = &(*pHRNDC);
30 
32 
33  es.get<CaloGeometryRecord>().get(geometry);
34 
35  const std::vector<DetId> &hbCells = geometry->getValidDetIds(DetId::Hcal, HcalBarrel);
36  const std::vector<DetId> &heCells = geometry->getValidDetIds(DetId::Hcal, HcalEndcap);
37  const std::vector<DetId> &hoCells = geometry->getValidDetIds(DetId::Hcal, HcalOuter);
38  const std::vector<DetId> &hfCells = geometry->getValidDetIds(DetId::Hcal, HcalForward);
39 
40  nChannels_[1] = hbCells.size();
41  nChannels_[2] = heCells.size();
42  nChannels_[3] = hoCells.size();
43  nChannels_[4] = hfCells.size();
44  nChannels_[0] = nChannels_[1] + nChannels_[2] + nChannels_[3] + nChannels_[4];
45  // avoid divide by zero
46  for (unsigned i = 0; i < 5; ++i) {
47  if (nChannels_[i] == 0)
48  nChannels_[i] = 1;
49  }
50 
51  // std::cout << "Channels HB:" << nChannels_[1] << " HE:" << nChannels_[2] <<
52  // " HO:" << nChannels_[3] << " HF:" << nChannels_[4] << std::endl;
53 
54  // We hardcode the HF depths because in the dual readout configuration,
55  // rechits are not defined for depths 3&4
56  maxDepthHF_ = (maxDepthHF_ > 2 ? 2 : maxDepthHF_); // We reatin the dynamic possibility
57  // that HF might have 0 or 1 depths
58 
61 }
62 
64  igetter.setCurrentFolder(dirName_);
65 
66  if (verbose_)
67  std::cout << "\nrunClient" << std::endl;
68 
69  std::vector<MonitorElement *> hcalMEs;
70 
71  // Since out folders are fixed to three, we can just go over these three
72  // folders i.e., CaloTowersD/CaloTowersTask, HcalRecHitsD/HcalRecHitTask,
73  // NoiseRatesV/NoiseRatesTask.
74  std::vector<std::string> fullPathHLTFolders = igetter.getSubdirs();
75  for (unsigned int i = 0; i < fullPathHLTFolders.size(); i++) {
76  if (verbose_)
77  std::cout << "\nfullPath: " << fullPathHLTFolders[i] << std::endl;
78  igetter.setCurrentFolder(fullPathHLTFolders[i]);
79 
80  std::vector<std::string> fullSubPathHLTFolders = igetter.getSubdirs();
81  for (unsigned int j = 0; j < fullSubPathHLTFolders.size(); j++) {
82  if (verbose_)
83  std::cout << "fullSub: " << fullSubPathHLTFolders[j] << std::endl;
84 
85  if (strcmp(fullSubPathHLTFolders[j].c_str(), "HcalRecHitsD/HcalRecHitTask") == 0) {
86  hcalMEs = igetter.getContents(fullSubPathHLTFolders[j]);
87  if (verbose_)
88  std::cout << "hltMES size : " << hcalMEs.size() << std::endl;
89  if (!HcalRecHitsEndjob(hcalMEs))
90  std::cout << "\nError in HcalRecHitsEndjob!" << std::endl << std::endl;
91  }
92  }
93  }
94 }
95 
96 // called after entering the HcalRecHitsD/HcalRecHitTask directory
97 // hcalMEs are within that directory
98 int HcalRecHitsDQMClient::HcalRecHitsEndjob(const std::vector<MonitorElement *> &hcalMEs) {
99  MonitorElement *Nhf = nullptr;
100 
101  // Search for emap histograms, and collect them into this vector
102  // All subdtectors are plotted together in these histograms. We only need to
103  // look for different depths
104  std::vector<MonitorElement *> emap_depths;
105 
106  // This vector is filled occupancy_maps identified by both subdetector and
107  // depth
108  std::vector<MonitorElement *> occupancy_maps;
109  std::vector<std::string> occupancyID;
110 
111  // This vector is filled with emean_vs_ieta histograms, they are divided by
112  // both subdetector and depth
113  std::vector<MonitorElement *> emean_vs_ieta;
114 
115  // These are the only histograms filled in this module; however, the
116  // histograms are created empty in HcalRecHitsAnalyzer occupancy_vs_ieta,
117  // divided by both subdetector and depth
118  std::vector<MonitorElement *> occupancy_vs_ieta;
119  std::vector<std::string> occupancy_vs_ietaID;
120 
121  // RecHit_StatusWord & RecHit_Aux_StatusWord
122  // Divided by subdectector
123  std::vector<MonitorElement *> RecHit_StatusWord;
124  std::vector<float> RecHit_StatusWord_Channels;
125  std::vector<MonitorElement *> RecHit_Aux_StatusWord;
126  std::vector<float> RecHit_Aux_StatusWord_Channels;
127 
128  for (unsigned int ih = 0; ih < hcalMEs.size(); ih++) {
129  // N_HF is not special, it is just convient to get the total number of
130  // events The number of entries in N_HF is equal to the number of events
131  if (hcalMEs[ih]->getName() == "N_HF") {
132  Nhf = hcalMEs[ih];
133  continue;
134  }
135 
136  // ***********************
137  // * We fill the various MonitorElement vectors by searching for a matching
138  // substring
139  // * The methods that are used are agnostic to the ordering of vectors
140  // ***********************
141 
142  if (hcalMEs[ih]->getName().find("emap_depth") != std::string::npos) {
143  emap_depths.push_back(hcalMEs[ih]);
144  continue;
145  }
146 
147  if (hcalMEs[ih]->getName().find("occupancy_map_H") != std::string::npos) {
148  occupancy_maps.push_back(hcalMEs[ih]);
149 
150  // Use occupancyID to save the subdetector and depth information
151  // This will help preserve both indifference to vector ordering and
152  // specific details of the detector topology The position in occupancyID
153  // must correspond to the histogram position in occupancy_maps
154 
155  // Save the string after "occupancy_map_"
156 
157  std::string prefix = "occupancy_map_";
158 
159  occupancyID.push_back(hcalMEs[ih]->getName().substr(prefix.size()));
160 
161  continue;
162  }
163 
164  if (hcalMEs[ih]->getName().find("emean_vs_ieta_H") != std::string::npos) {
165  emean_vs_ieta.push_back(hcalMEs[ih]);
166  continue;
167  }
168 
169  if (hcalMEs[ih]->getName().find("occupancy_vs_ieta_H") != std::string::npos) {
170  occupancy_vs_ieta.push_back(hcalMEs[ih]);
171 
172  // Use occupancy_vs_ietaID to save the subdetector and depth information
173  // This will help preserve both indifference to vector ordering and
174  // specific details of the detector topology The position in occupancyID
175  // must correspond to the histogram position in occupancy_vs_ieta
176 
177  // Save the string after "occupancy_vs_ieta_"
178 
179  std::string prefix = "occupancy_vs_ieta_";
180 
181  occupancy_vs_ietaID.push_back(hcalMEs[ih]->getName().substr(prefix.size()));
182 
183  continue;
184  }
185 
186  if (hcalMEs[ih]->getName().find("HcalRecHitTask_RecHit_StatusWord_H") != std::string::npos) {
187  RecHit_StatusWord.push_back(hcalMEs[ih]);
188 
189  if (hcalMEs[ih]->getName().find("HB") != std::string::npos) {
190  RecHit_StatusWord_Channels.push_back((float)nChannels_[1]);
191  } else if (hcalMEs[ih]->getName().find("HE") != std::string::npos) {
192  RecHit_StatusWord_Channels.push_back((float)nChannels_[2]);
193  } else if (hcalMEs[ih]->getName().find("H0") != std::string::npos) {
194  RecHit_StatusWord_Channels.push_back((float)nChannels_[3]);
195  } else if (hcalMEs[ih]->getName().find("HF") != std::string::npos) {
196  RecHit_StatusWord_Channels.push_back((float)nChannels_[4]);
197  } else {
198  RecHit_StatusWord_Channels.push_back(1.);
199  }
200 
201  continue;
202  }
203 
204  if (hcalMEs[ih]->getName().find("HcalRecHitTask_RecHit_Aux_StatusWord_H") != std::string::npos) {
205  RecHit_Aux_StatusWord.push_back(hcalMEs[ih]);
206 
207  if (hcalMEs[ih]->getName().find("HB") != std::string::npos) {
208  RecHit_Aux_StatusWord_Channels.push_back((float)nChannels_[1]);
209  } else if (hcalMEs[ih]->getName().find("HE") != std::string::npos) {
210  RecHit_Aux_StatusWord_Channels.push_back((float)nChannels_[2]);
211  } else if (hcalMEs[ih]->getName().find("H0") != std::string::npos) {
212  RecHit_Aux_StatusWord_Channels.push_back((float)nChannels_[3]);
213  } else if (hcalMEs[ih]->getName().find("HF") != std::string::npos) {
214  RecHit_Aux_StatusWord_Channels.push_back((float)nChannels_[4]);
215  } else {
216  RecHit_Aux_StatusWord_Channels.push_back(1.);
217  }
218 
219  continue;
220  }
221  }
222 
223  // mean energies and occupancies evaluation
224 
225  double nevtot = Nhf->getEntries(); // Use the number of entries in the Nhf histogram to
226  // give the total number of events
227 
228  if (verbose_)
229  std::cout << "nevtot : " << nevtot << std::endl;
230 
231  // emap histograms are scaled by the number of events
232  float fev = float(nevtot);
233  double scaleBynevtot = 1 / fev;
234 
235  // In this and the following histogram vectors, recognize that the for-loop
236  // index does not have to correspond to any particular depth
237  for (unsigned int depthIdx = 0; depthIdx < emap_depths.size(); depthIdx++) {
238  int nx = emap_depths[depthIdx]->getNbinsX();
239  int ny = emap_depths[depthIdx]->getNbinsY();
240 
241  float cnorm;
242  float enorm;
243 
244  for (int i = 1; i <= nx; i++) {
245  for (int j = 1; j <= ny; j++) {
246  cnorm = emap_depths[depthIdx]->getBinContent(i, j) * scaleBynevtot;
247  enorm = emap_depths[depthIdx]->getBinError(i, j) * scaleBynevtot;
248  emap_depths[depthIdx]->setBinContent(i, j, cnorm);
249  emap_depths[depthIdx]->setBinError(i, j, enorm);
250  }
251  }
252  }
253 
254  // occupancy_maps & matched occupancy_vs_ieta
255 
256  bool omatched = false;
257 
258  for (unsigned int occupancyIdx = 0; occupancyIdx < occupancy_maps.size(); occupancyIdx++) {
259  int nx = occupancy_maps[occupancyIdx]->getNbinsX();
260  int ny = occupancy_maps[occupancyIdx]->getNbinsY();
261 
262  float cnorm;
263  float enorm;
264 
265  unsigned int vsIetaIdx = occupancy_vs_ieta.size();
266  omatched = false;
267 
268  for (vsIetaIdx = 0; vsIetaIdx < occupancy_vs_ieta.size(); vsIetaIdx++) {
269  if (occupancyID[occupancyIdx] == occupancy_vs_ietaID[vsIetaIdx]) {
270  omatched = true;
271  break;
272  }
273  } // match occupancy_vs_ieta histogram
274 
275  for (int i = 1; i <= nx; i++) {
276  for (int j = 1; j <= ny; j++) {
277  cnorm = occupancy_maps[occupancyIdx]->getBinContent(i, j) * scaleBynevtot;
278  enorm = occupancy_maps[occupancyIdx]->getBinError(i, j) * scaleBynevtot;
279  occupancy_maps[occupancyIdx]->setBinContent(i, j, cnorm);
280  occupancy_maps[occupancyIdx]->setBinError(i, j, enorm);
281  }
282  }
283 
284  // Fill occupancy_vs_ieta
285 
286  if (omatched) {
287  // We run over all of the ieta values
288  for (int ieta = -41; ieta <= 41; ieta++) {
289  float phi_factor = 1.;
290  float sumphi = 0.;
291  float sumphie = 0.;
292 
293  if (ieta == 0)
294  continue; // ieta=0 is not defined
295 
296  phi_factor = phifactor(ieta);
297 
298  // the rechits occupancy map defines iphi as 0..71
299  for (int iphi = 0; iphi <= 71; iphi++) {
300  int binIeta = occupancy_maps[occupancyIdx]->getTH2F()->GetXaxis()->FindBin(float(ieta));
301  int binIphi = occupancy_maps[occupancyIdx]->getTH2F()->GetYaxis()->FindBin(float(iphi));
302 
303  float content = occupancy_maps[occupancyIdx]->getBinContent(binIeta, binIphi);
304  float econtent = occupancy_maps[occupancyIdx]->getBinError(binIeta, binIphi);
305 
306  sumphi += content;
307  sumphie += econtent * econtent;
308  } // for loop over phi
309 
310  int ietabin = occupancy_vs_ieta[vsIetaIdx]->getTH1F()->GetXaxis()->FindBin(float(ieta));
311 
312  // fill occupancies vs ieta
313  cnorm = sumphi / phi_factor;
314  enorm = sqrt(sumphie) / phi_factor;
315  occupancy_vs_ieta[vsIetaIdx]->setBinContent(ietabin, cnorm);
316  occupancy_vs_ieta[vsIetaIdx]->setBinError(ietabin, enorm);
317 
318  } // Fill occupancy_vs_ieta
319  } // if omatched
320  }
321 
322  // Status Word
323  // Normalized by number of events and by number of channels per subdetector as
324  // well
325 
326  for (unsigned int StatusWordIdx = 0; StatusWordIdx < RecHit_StatusWord.size(); StatusWordIdx++) {
327  int nx = RecHit_StatusWord[StatusWordIdx]->getNbinsX();
328 
329  float cnorm;
330  float enorm;
331 
332  for (int i = 1; i <= nx; i++) {
333  cnorm = RecHit_StatusWord[StatusWordIdx]->getBinContent(i) * scaleBynevtot /
334  RecHit_StatusWord_Channels[StatusWordIdx];
335  enorm =
336  RecHit_StatusWord[StatusWordIdx]->getBinError(i) * scaleBynevtot / RecHit_StatusWord_Channels[StatusWordIdx];
337  RecHit_StatusWord[StatusWordIdx]->setBinContent(i, cnorm);
338  RecHit_StatusWord[StatusWordIdx]->setBinError(i, enorm);
339  }
340  }
341 
342  for (unsigned int AuxStatusWordIdx = 0; AuxStatusWordIdx < RecHit_Aux_StatusWord.size(); AuxStatusWordIdx++) {
343  int nx = RecHit_Aux_StatusWord[AuxStatusWordIdx]->getNbinsX();
344 
345  float cnorm;
346  float enorm;
347 
348  for (int i = 1; i <= nx; i++) {
349  cnorm = RecHit_Aux_StatusWord[AuxStatusWordIdx]->getBinContent(i) * scaleBynevtot /
350  RecHit_Aux_StatusWord_Channels[AuxStatusWordIdx];
351  enorm = RecHit_Aux_StatusWord[AuxStatusWordIdx]->getBinError(i) * scaleBynevtot /
352  RecHit_Aux_StatusWord_Channels[AuxStatusWordIdx];
353  RecHit_Aux_StatusWord[AuxStatusWordIdx]->setBinContent(i, cnorm);
354  RecHit_Aux_StatusWord[AuxStatusWordIdx]->setBinError(i, enorm);
355  }
356  }
357 
358  return 1;
359 }
360 
362  float phi_factor_;
363 
364  if (ieta >= -20 && ieta <= 20) {
365  phi_factor_ = 72.;
366  } else {
367  if (ieta >= 40 || ieta <= -40) {
368  phi_factor_ = 18.;
369  } else {
370  phi_factor_ = 36.;
371  }
372  }
373 
374  return phi_factor_;
375 }
376 
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
const HcalDDDRecConstants * hcons
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:361
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
void beginJob(void) override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
T sqrt(T t)
Definition: SSEVec.h:18
int HcalRecHitsEndjob(const std::vector< MonitorElement * > &hcalMEs)
std::vector< MonitorElement * > getContents(Args &&...args)
Definition: DQMStore.h:192
TString getName(TString structure, int layer, TString geometry)
Definition: DMRtrends.cc:167
double getEntries() const
get # of entries
int getMaxDepth(const int &type) const
HcalRecHitsDQMClient(const edm::ParameterSet &)
void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override
std::vector< DetId > getValidDetIds() const
Get the list of all valid detector ids.
ESHandle< TrackerGeometry > geometry
void beginRun(edm::Run const &, edm::EventSetup const &) override
T get() const
Definition: EventSetup.h:71
std::vector< std::string > getSubdirs()
Definition: DQMStore.cc:325
Definition: Run.h:45