CMS 3D CMS Logo

RecAnalyzerHF.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 #include <string>
4 #include <iostream>
5 #include <fstream>
6 #include <sstream>
7 #include <vector>
8 #include <map>
9 
10 // user include files
32 
34 
35 #include "TH1D.h"
36 #include "TTree.h"
37 
38 //#define EDM_ML_DEBUG
39 
40 // class declaration
41 class RecAnalyzerHF : public edm::one::EDAnalyzer<edm::one::SharedResources> {
42 
43 public:
44  explicit RecAnalyzerHF(const edm::ParameterSet&);
45  ~RecAnalyzerHF() override;
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49 private:
50  void analyze(edm::Event const&, edm::EventSetup const&) override;
51  void beginJob() override;
52  void endJob() override;
53 
54 private:
55  void analyzeHcal(const HFPreRecHitCollection&, int, bool);
56 
57  // ----------member data ---------------------------
60  double eLowHF_, eHighHF_;
61  std::vector<unsigned int> hcalID_;
62  TTree *myTree_;
63  TH1D *hist_[2];
64  std::vector<std::pair<TH1D*,TH1D*>> histo_;
65  std::vector<int> trigbit_;
66  double rnnum_;
67  struct myInfo{
68  double kount, f11, f12, f13, f14, f21, f22, f23, f24, runcheck;
69  myInfo() {
70  kount = f11 = f12 = f13 = f14 = f21 = f22 = f23 = f24 = runcheck = 0;
71  }
72  };
73  // Root tree members
74  double rnnumber;
78  std::map<std::pair<int,HcalDetId>,myInfo> myMap_;
81 };
82 
83 // constructors and destructor
85 
86  usesResource("TFileService");
87  // get name of output file with histogramms
88  nzs_ = iConfig.getParameter<bool>("RunNZS");
89  noise_ = iConfig.getParameter<bool>("Noise");
90  ratio_ = iConfig.getParameter<bool>("Ratio");
91  eLowHF_ = iConfig.getParameter<double>("ELowHF");
92  eHighHF_ = iConfig.getParameter<double>("EHighHF");
93  trigbit_ = iConfig.getUntrackedParameter<std::vector<int>>("TriggerBits");
94  ignoreL1_ = iConfig.getUntrackedParameter<bool>("IgnoreL1",false);
95  fillTree_ = iConfig.getUntrackedParameter<bool>("FillTree",true);
96  std::vector<int> ieta = iConfig.getUntrackedParameter<std::vector<int>>("HcalIeta");
97  std::vector<int> iphi = iConfig.getUntrackedParameter<std::vector<int>>("HcalIphi");
98  std::vector<int> depth= iConfig.getUntrackedParameter<std::vector<int>>("HcalDepth");
99 
100  // get token names of modules, producing object collections
101  tok_hfreco_ = consumes<HFPreRecHitCollection>(iConfig.getParameter<edm::InputTag>("hfInput"));
102  tok_hltL1GtMap_ = consumes<L1GlobalTriggerObjectMapRecord>(edm::InputTag("hltL1GtObjectMap"));
103 
104  edm::LogVerbatim("RecAnalyzer") << " Flags (IgnoreL1): " << ignoreL1_
105  << " (NZS) " << nzs_ << " (Noise) " << noise_
106  << " (Ratio) " << ratio_;
107  edm::LogVerbatim("RecAnalyzer") << "Thresholds for HF " << eLowHF_ << ":"
108  << eHighHF_;
109  for (unsigned int k=0; k<ieta.size(); ++k) {
110  if (std::abs(ieta[k]) >= 29) {
111  unsigned int id = (HcalDetId(HcalForward,ieta[k],iphi[k],depth[k])).rawId();
112  hcalID_.push_back(id);
113  edm::LogVerbatim("RecAnalyzer") << "DetId[" << k << "] " << HcalDetId(id);
114  }
115  }
116  edm::LogVerbatim("RecAnalyzer") << "Select on " << trigbit_.size()
117  << " L1 Trigger selection";
118  unsigned int k(0);
119  for (auto trig : trigbit_) {
120  edm::LogVerbatim("RecAnalyzer") << "Bit[" << k << "] " << trig; ++k;}
121 }
122 
124 
125 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
127 
129  desc.add<bool>("RunNZS",true);
130  desc.add<bool>("Noise",false);
131  desc.add<bool>("Ratio",false);
132  desc.add<double>("ELowHF",10);
133  desc.add<double>("EHighHF",150);
134  std::vector<int> idummy;
135  desc.addUntracked<std::vector<int> >("TriggerBits",idummy);
136  desc.addUntracked<bool>("IgnoreL1",false);
137  desc.addUntracked<bool>("FillHisto",false);
138  desc.addUntracked<std::vector<int> >("HcalIeta",idummy);
139  desc.addUntracked<std::vector<int> >("HcalIphi",idummy);
140  desc.addUntracked<std::vector<int> >("HcalDepth",idummy);
141  desc.add<edm::InputTag>("hfInput",edm::InputTag("hfprereco"));
142  descriptions.add("recAnalyzerHF",desc);
143 }
144 
146 
147  char name[700], title[700];
148  double xmin(-10.0), xmax(90.0);
149  if (ratio_) { xmin = -5.0; xmax = 5.0;}
150  for (int i=0; i<2; ++i) {
151  sprintf(name, "HF%d", i);
152  sprintf (title, "The metric F%d for HF", i+1);
153  hist_[i] = fs_->make<TH1D>(name,title,50,xmin,xmax);
154  }
155 
156  for (const auto & id : hcalID_) {
157  HcalDetId hid = HcalDetId(id);
158  TH1D *h1(nullptr), *h2(nullptr);
159  for (int i=0; i<2; ++i) {
160  sprintf (name, "HF%d%d_%d_%d", i, hid.ieta(), hid.iphi(), hid.depth());
161  sprintf (title, "The metric F%d for HF i#eta %d i#phi %d depth %d",
162  i+1, hid.ieta(), hid.iphi(), hid.depth());
163  if (i == 0) h1 = fs_->make<TH1D>(name, title, 50, xmin, xmax);
164  else h2 = fs_->make<TH1D>(name, title, 50, xmin, xmax);
165  }
166  histo_.push_back(std::pair<TH1D*,TH1D*>(h1,h2));
167  };
168 
169  if (fillTree_) {
170  myTree_ = fs_->make<TTree>("RecJet","RecJet Tree");
171  myTree_->Branch("cells", &cells, "cells/I");
172  myTree_->Branch("mysubd", &mysubd, "mysubd/I");
173  myTree_->Branch("depth", &depth, "depth/I");
174  myTree_->Branch("ieta", &ieta, "ieta/I");
175  myTree_->Branch("iphi", &iphi, "iphi/I");
176  myTree_->Branch("mom0_F1", &mom0_F1, "mom0_F1/F");
177  myTree_->Branch("mom1_F1", &mom1_F1, "mom1_F1/F");
178  myTree_->Branch("mom2_F1", &mom2_F1, "mom2_F1/F");
179  myTree_->Branch("mom3_F1", &mom3_F1, "mom3_F1/F");
180  myTree_->Branch("mom4_F1", &mom4_F1, "mom4_F1/F");
181  myTree_->Branch("mom0_F2", &mom0_F2, "mom0_F2/F");
182  myTree_->Branch("mom1_F2", &mom1_F2, "mom1_F2/F");
183  myTree_->Branch("mom2_F2", &mom2_F2, "mom2_F2/F");
184  myTree_->Branch("mom3_F2", &mom3_F2, "mom3_F2/F");
185  myTree_->Branch("mom4_F2", &mom4_F2, "mom4_F2/F");
186  myTree_->Branch("trigbit", &trigbit, "trigbit/I");
187  myTree_->Branch("rnnumber", &rnnumber, "rnnumber/D");
188  }
189 
190  myMap_.clear();
191 }
192 
194 
195  if (fillTree_) {
196  cells = 0;
197  for (const auto & itr : myMap_) {
198  edm::LogVerbatim("RecAnalyzer") << "Fired trigger bit number "
199  << itr.first.first;
200  myInfo info = itr.second;
201  if (info.kount > 0) {
202  mom0_F1 = info.kount;
203  mom1_F1 = info.f11;
204  mom2_F1 = info.f12;
205  mom3_F1 = info.f13;
206  mom4_F1 = info.f14;
207  mom0_F2 = info.kount;
208  mom1_F2 = info.f21;
209  mom2_F2 = info.f22;
210  mom3_F2 = info.f23;
211  mom4_F2 = info.f24;
212  rnnumber = info.runcheck;
213  trigbit = itr.first.first;
214  mysubd = itr.first.second.subdet();
215  depth = itr.first.second.depth();
216  iphi = itr.first.second.iphi();
217  ieta = itr.first.second.ieta();
218  edm::LogVerbatim("RecAnalyzer") << " Result= " << trigbit << " "
219  << mysubd << " " << ieta << " " << iphi
220  << " F1:mom0 " << mom0_F1 << " mom1 "
221  << mom1_F1 << " mom2 " << mom2_F1
222  << " mom3 " << mom3_F1 << " mom4 "
223  << mom4_F1 << " F2:mom0 " << mom0_F2
224  << " mom1 " << mom1_F2 << " mom2 "
225  << mom2_F2 << " mom3 " << mom3_F2
226  << " mom4 " << mom4_F2;
227  myTree_->Fill();
228  cells++;
229  }
230  }
231  edm::LogVerbatim("RecAnalyzer") << "cells" << " " << cells;
232  }
233 #ifdef EDM_ML_DEBUG
234  edm::LogVerbatim("RecAnalyzer") << "Exiting from RecAnalyzerHF::endjob";
235 #endif
236 }
237 
238 //
239 // member functions
240 //
241 // ------------ method called to produce the data ------------
242 
244 
245  rnnum_ = (double)iEvent.run();
246 
248  iEvent.getByToken(tok_hfreco_, hf);
249  if (!hf.isValid()) {
250  edm::LogWarning("RecAnalyzer") << "HcalCalibAlgos: Error! can't get hf product!";
251  return;
252  }
253  const HFPreRecHitCollection Hithf = *(hf.product());
254  edm::LogVerbatim("RecAnalyzer") << "HF MB size of collection "
255  << Hithf.size();
256  if (Hithf.size() < 1700 && nzs_) {
257  edm::LogWarning("RecAnalyzer") << "HF problem " << rnnum_ << " size "
258  << Hithf.size();
259  }
260 
261  bool select(false);
262  if (!trigbit_.empty()) {
264  iEvent.getByToken(tok_hltL1GtMap_, gtObjectMapRecord);
265  if (gtObjectMapRecord.isValid()) {
266  const std::vector<L1GlobalTriggerObjectMap>& objMapVec = gtObjectMapRecord->gtObjectMap();
267  for (std::vector<L1GlobalTriggerObjectMap>::const_iterator itMap = objMapVec.begin();
268  itMap != objMapVec.end(); ++itMap) {
269  bool resultGt = (*itMap).algoGtlResult();
270  if (resultGt) {
271  int algoBit = (*itMap).algoBitNumber();
272  if (std::find(trigbit_.begin(),trigbit_.end(),algoBit) !=
273  trigbit_.end()) {
274  select = true;
275  break;
276  }
277  }
278  }
279  }
280  }
281 
282  //event weight for FLAT sample and PU information
283 
284  if (ignoreL1_ || (!trigbit_.empty() && select)) {
285  analyzeHcal(Hithf, 1, true);
286  } else if ((!ignoreL1_) && (trigbit_.empty())) {
288  iEvent.getByToken(tok_hltL1GtMap_, gtObjectMapRecord);
289  if (gtObjectMapRecord.isValid()) {
290  const std::vector<L1GlobalTriggerObjectMap>& objMapVec = gtObjectMapRecord->gtObjectMap();
291  bool ok(false);
292  for (std::vector<L1GlobalTriggerObjectMap>::const_iterator itMap = objMapVec.begin();
293  itMap != objMapVec.end(); ++itMap) {
294  bool resultGt = (*itMap).algoGtlResult();
295  if (resultGt) {
296  int algoBit = (*itMap).algoBitNumber();
297  analyzeHcal(Hithf, algoBit, (!ok));
298  ok = true;
299  }
300  }
301  if (!ok) {
302  edm::LogVerbatim("RecAnalyzer") << "No passed L1 Trigger found";
303  }
304  }
305  }
306 }
307 
309  int algoBit, bool fill) {
310 #ifdef EDM_ML_DEBUG
311  edm::LogVerbatim("RecAnalyzer") << "Enter analyzeHcal for bit " << algoBit
312  << " Fill " << fill << " Collection size "
313  << Hithf.size();
314 #endif
315  // Signal part for HF
316  for (const auto & hfItr : Hithf) {
317  HcalDetId hid = hfItr.id();
318  double e0 = (hfItr.getHFQIE10Info(0)==nullptr) ? 0 : hfItr.getHFQIE10Info(0)->energy();
319  double e1 = (hfItr.getHFQIE10Info(1)==nullptr) ? 0 : hfItr.getHFQIE10Info(1)->energy();
320  double energy = e0+e1;
321  if (std::abs(energy) < 1e-6) energy = (energy > 0) ? 1e-6 : -1e-6;
322  double f1(e0), f2(e1);
323  if (ratio_) {
324  f1 /= energy;
325  f2 /= energy;
326  }
327 #ifdef EDM_ML_DEBUG
328  edm::LogVerbatim("RecAnalyzer") << hid << " E " << e0 << ":" << e1
329  << " F " << f1 << ":" << f2;
330 #endif
331  if (fill) {
332  for (unsigned int i = 0; i < hcalID_.size(); i++) {
333  if (hcalID_[i] == hid.rawId()) {
334  histo_[i].first->Fill(f1);
335  histo_[i].second->Fill(f2);
336  break;
337  }
338  }
339  hist_[0]->Fill(f1);
340  hist_[1]->Fill(f2);
341  }
342 
343  //
344  // Remove PMT hits
345  //
346  if (((noise_ || nzs_) && fabs(energy) <= 40.) ||
347  (energy >= eLowHF_ && energy <= eHighHF_)) {
348  std::map<std::pair<int,HcalDetId>,myInfo>::iterator itr1 = myMap_.find(std::pair<int,HcalDetId>(algoBit,hid));
349  if (itr1 == myMap_.end()) {
350  myInfo info;
351  myMap_[std::pair<int,HcalDetId>(algoBit,hid)] = info;
352  itr1 = myMap_.find(std::pair<int,HcalDetId>(algoBit,hid));
353  }
354  itr1->second.kount += 1.0;
355  itr1->second.f11 += (f1);
356  itr1->second.f12 += (f1*f1);
357  itr1->second.f13 += (f1*f1*f1);
358  itr1->second.f14 += (f1*f1*f1*f1);
359  itr1->second.f21 += (f2);
360  itr1->second.f22 += (f2*f2);
361  itr1->second.f23 += (f2*f2*f2);
362  itr1->second.f24 += (f2*f2*f2*f2);
363  itr1->second.runcheck = rnnum_;
364  }
365  }
366 }
367 
368 //define this as a plug-in
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
TH1D * hist_[2]
static const TGPicture * info(bool iBackgroundIsBlack)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
void endJob() override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::vector< unsigned int > hcalID_
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:47
std::vector< int > trigbit_
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
void analyze(edm::Event const &, edm::EventSetup const &) override
void beginJob() override
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
~RecAnalyzerHF() override
const std::vector< L1GlobalTriggerObjectMap > & gtObjectMap() const
get / set the vector of object maps
int depth() const
get the tower depth
Definition: HcalDetId.h:162
int iEvent
Definition: GenABIO.cc:230
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< std::pair< TH1D *, TH1D * > > histo_
RecAnalyzerHF(const edm::ParameterSet &)
int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
RunNumber_t run() const
Definition: Event.h:109
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::EDGetTokenT< HFPreRecHitCollection > tok_hfreco_
bool isValid() const
Definition: HandleBase.h:74
int k[5][pyjets_maxn]
int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
edm::Service< TFileService > fs_
T const * product() const
Definition: Handle.h:81
void add(std::string const &label, ParameterSetDescription const &psetDescription)
size_type size() const
edm::EDGetTokenT< L1GlobalTriggerObjectMapRecord > tok_hltL1GtMap_
void analyzeHcal(const HFPreRecHitCollection &, int, bool)
std::map< std::pair< int, HcalDetId >, myInfo > myMap_