CMS 3D CMS Logo

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