File indexing completed on 2024-04-06 11:59:02
0001
0002 #include <memory>
0003 #include <string>
0004 #include <iostream>
0005 #include <fstream>
0006 #include <sstream>
0007 #include <vector>
0008 #include <map>
0009
0010
0011 #include "CondFormats/DataRecord/interface/HcalRespCorrsRcd.h"
0012 #include "CondFormats/HcalObjects/interface/HcalRespCorrs.h"
0013 #include "FWCore/Common/interface/TriggerNames.h"
0014 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/EventSetup.h"
0017 #include "FWCore/Framework/interface/Frameworkfwd.h"
0018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0020 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0021 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0022 #include "FWCore/ServiceRegistry/interface/Service.h"
0023 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0024 #include "DataFormats/Common/interface/TriggerResults.h"
0025 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
0026 #include "DataFormats/HcalDetId/interface/HcalSubdetector.h"
0027 #include "DataFormats/HcalRecHit/interface/HcalRecHitCollections.h"
0028 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMap.h"
0029 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerObjectMapRecord.h"
0030 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
0031
0032 #include "Geometry/CaloTopology/interface/HcalTopology.h"
0033
0034 #include "TH1D.h"
0035 #include "TTree.h"
0036
0037
0038
0039
0040 class RecAnalyzerHF : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0041 public:
0042 explicit RecAnalyzerHF(const edm::ParameterSet&);
0043 ~RecAnalyzerHF() override = default;
0044
0045 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0046
0047 private:
0048 void analyze(edm::Event const&, edm::EventSetup const&) override;
0049 void beginJob() override;
0050 void endJob() override;
0051
0052 private:
0053 void analyzeHcal(const HFPreRecHitCollection&, int, bool);
0054
0055
0056 bool nzs_, noise_, ratio_, ignoreL1_, fillTree_;
0057 double eLowHF_, eHighHF_;
0058 std::vector<int> trigbit_;
0059 std::vector<unsigned int> hcalID_;
0060 TTree* myTree_;
0061 TH1D* hist_[2];
0062 std::vector<std::pair<TH1D*, TH1D*>> histo_;
0063 double rnnum_;
0064 struct myInfo {
0065 double kount, f11, f12, f13, f14, f21, f22, f23, f24, runcheck;
0066 myInfo() { kount = f11 = f12 = f13 = f14 = f21 = f22 = f23 = f24 = runcheck = 0; }
0067 };
0068
0069 double rnnumber;
0070 int mysubd, depth, iphi, ieta, cells, trigbit;
0071 float mom0_F1, mom1_F1, mom2_F1, mom3_F1, mom4_F1;
0072 float mom0_F2, mom1_F2, mom2_F2, mom3_F2, mom4_F2;
0073 std::map<std::pair<int, HcalDetId>, myInfo> myMap_;
0074 edm::EDGetTokenT<HFPreRecHitCollection> tok_hfreco_;
0075 edm::EDGetTokenT<L1GlobalTriggerObjectMapRecord> tok_hltL1GtMap_;
0076 };
0077
0078
0079 RecAnalyzerHF::RecAnalyzerHF(const edm::ParameterSet& iConfig)
0080 : nzs_(iConfig.getParameter<bool>("RunNZS")),
0081 noise_(iConfig.getParameter<bool>("Noise")),
0082 ratio_(iConfig.getParameter<bool>("Ratio")),
0083 ignoreL1_(iConfig.getUntrackedParameter<bool>("IgnoreL1", false)),
0084 fillTree_(iConfig.getUntrackedParameter<bool>("FillTree", true)),
0085 eLowHF_(iConfig.getParameter<double>("ELowHF")),
0086 eHighHF_(iConfig.getParameter<double>("EHighHF")),
0087 trigbit_(iConfig.getUntrackedParameter<std::vector<int>>("TriggerBits")),
0088 tok_hfreco_(consumes<HFPreRecHitCollection>(iConfig.getParameter<edm::InputTag>("hfInput"))),
0089 tok_hltL1GtMap_(consumes<L1GlobalTriggerObjectMapRecord>(edm::InputTag("hltL1GtObjectMap"))) {
0090 usesResource("TFileService");
0091
0092 std::vector<int> ieta = iConfig.getUntrackedParameter<std::vector<int>>("HcalIeta");
0093 std::vector<int> iphi = iConfig.getUntrackedParameter<std::vector<int>>("HcalIphi");
0094 std::vector<int> depth = iConfig.getUntrackedParameter<std::vector<int>>("HcalDepth");
0095
0096 edm::LogVerbatim("RecAnalyzerHF") << " Flags (IgnoreL1): " << ignoreL1_ << " (NZS) " << nzs_ << " (Noise) " << noise_
0097 << " (Ratio) " << ratio_;
0098 edm::LogVerbatim("RecAnalyzerHF") << "Thresholds for HF " << eLowHF_ << ":" << eHighHF_;
0099 for (unsigned int k = 0; k < ieta.size(); ++k) {
0100 if (std::abs(ieta[k]) >= 29) {
0101 unsigned int id = (HcalDetId(HcalForward, ieta[k], iphi[k], depth[k])).rawId();
0102 hcalID_.push_back(id);
0103 edm::LogVerbatim("RecAnalyzerHF") << "DetId[" << k << "] " << HcalDetId(id);
0104 }
0105 }
0106 edm::LogVerbatim("RecAnalyzerHF") << "Select on " << trigbit_.size() << " L1 Trigger selection";
0107 unsigned int k(0);
0108 for (auto trig : trigbit_) {
0109 edm::LogVerbatim("RecAnalyzerHF") << "Bit[" << k << "] " << trig;
0110 ++k;
0111 }
0112 }
0113
0114
0115 void RecAnalyzerHF::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0116 edm::ParameterSetDescription desc;
0117 desc.add<bool>("RunNZS", true);
0118 desc.add<bool>("Noise", false);
0119 desc.add<bool>("Ratio", false);
0120 desc.add<double>("ELowHF", 10);
0121 desc.add<double>("EHighHF", 150);
0122 std::vector<int> idummy;
0123 desc.addUntracked<std::vector<int>>("TriggerBits", idummy);
0124 desc.addUntracked<bool>("IgnoreL1", false);
0125 desc.addUntracked<bool>("FillHisto", false);
0126 desc.addUntracked<std::vector<int>>("HcalIeta", idummy);
0127 desc.addUntracked<std::vector<int>>("HcalIphi", idummy);
0128 desc.addUntracked<std::vector<int>>("HcalDepth", idummy);
0129 desc.add<edm::InputTag>("hfInput", edm::InputTag("hfprereco"));
0130 descriptions.add("recAnalyzerHF", desc);
0131 }
0132
0133 void RecAnalyzerHF::beginJob() {
0134 edm::Service<TFileService> fs;
0135 char name[700], title[700];
0136 double xmin(-10.0), xmax(90.0);
0137 if (ratio_) {
0138 xmin = -5.0;
0139 xmax = 5.0;
0140 }
0141 for (int i = 0; i < 2; ++i) {
0142 sprintf(name, "HF%d", i);
0143 sprintf(title, "The metric F%d for HF", i + 1);
0144 hist_[i] = fs->make<TH1D>(name, title, 50, xmin, xmax);
0145 }
0146
0147 for (const auto& id : hcalID_) {
0148 HcalDetId hid = HcalDetId(id);
0149 TH1D *h1(nullptr), *h2(nullptr);
0150 for (int i = 0; i < 2; ++i) {
0151 sprintf(name, "HF%d%d_%d_%d", i, hid.ieta(), hid.iphi(), hid.depth());
0152 sprintf(title, "The metric F%d for HF i#eta %d i#phi %d depth %d", i + 1, hid.ieta(), hid.iphi(), hid.depth());
0153 if (i == 0)
0154 h1 = fs->make<TH1D>(name, title, 50, xmin, xmax);
0155 else
0156 h2 = fs->make<TH1D>(name, title, 50, xmin, xmax);
0157 }
0158 histo_.push_back(std::pair<TH1D*, TH1D*>(h1, h2));
0159 };
0160
0161 if (fillTree_) {
0162 myTree_ = fs->make<TTree>("RecJet", "RecJet Tree");
0163 myTree_->Branch("cells", &cells, "cells/I");
0164 myTree_->Branch("mysubd", &mysubd, "mysubd/I");
0165 myTree_->Branch("depth", &depth, "depth/I");
0166 myTree_->Branch("ieta", &ieta, "ieta/I");
0167 myTree_->Branch("iphi", &iphi, "iphi/I");
0168 myTree_->Branch("mom0_F1", &mom0_F1, "mom0_F1/F");
0169 myTree_->Branch("mom1_F1", &mom1_F1, "mom1_F1/F");
0170 myTree_->Branch("mom2_F1", &mom2_F1, "mom2_F1/F");
0171 myTree_->Branch("mom3_F1", &mom3_F1, "mom3_F1/F");
0172 myTree_->Branch("mom4_F1", &mom4_F1, "mom4_F1/F");
0173 myTree_->Branch("mom0_F2", &mom0_F2, "mom0_F2/F");
0174 myTree_->Branch("mom1_F2", &mom1_F2, "mom1_F2/F");
0175 myTree_->Branch("mom2_F2", &mom2_F2, "mom2_F2/F");
0176 myTree_->Branch("mom3_F2", &mom3_F2, "mom3_F2/F");
0177 myTree_->Branch("mom4_F2", &mom4_F2, "mom4_F2/F");
0178 myTree_->Branch("trigbit", &trigbit, "trigbit/I");
0179 myTree_->Branch("rnnumber", &rnnumber, "rnnumber/D");
0180 }
0181
0182 myMap_.clear();
0183 }
0184
0185 void RecAnalyzerHF::endJob() {
0186 if (fillTree_) {
0187 cells = 0;
0188 for (const auto& itr : myMap_) {
0189 edm::LogVerbatim("RecAnalyzerHF") << "Fired trigger bit number " << itr.first.first;
0190 myInfo info = itr.second;
0191 if (info.kount > 0) {
0192 mom0_F1 = info.kount;
0193 mom1_F1 = info.f11;
0194 mom2_F1 = info.f12;
0195 mom3_F1 = info.f13;
0196 mom4_F1 = info.f14;
0197 mom0_F2 = info.kount;
0198 mom1_F2 = info.f21;
0199 mom2_F2 = info.f22;
0200 mom3_F2 = info.f23;
0201 mom4_F2 = info.f24;
0202 rnnumber = info.runcheck;
0203 trigbit = itr.first.first;
0204 mysubd = itr.first.second.subdet();
0205 depth = itr.first.second.depth();
0206 iphi = itr.first.second.iphi();
0207 ieta = itr.first.second.ieta();
0208 edm::LogVerbatim("RecAnalyzerHF")
0209 << " Result= " << trigbit << " " << mysubd << " " << ieta << " " << iphi << " F1:mom0 " << mom0_F1
0210 << " mom1 " << mom1_F1 << " mom2 " << mom2_F1 << " mom3 " << mom3_F1 << " mom4 " << mom4_F1 << " F2:mom0 "
0211 << mom0_F2 << " mom1 " << mom1_F2 << " mom2 " << mom2_F2 << " mom3 " << mom3_F2 << " mom4 " << mom4_F2;
0212 myTree_->Fill();
0213 cells++;
0214 }
0215 }
0216 edm::LogVerbatim("RecAnalyzerHF") << "cells"
0217 << " " << cells;
0218 }
0219 #ifdef EDM_ML_DEBUG
0220 edm::LogVerbatim("RecAnalyzerHF") << "Exiting from RecAnalyzerHF::endjob";
0221 #endif
0222 }
0223
0224
0225
0226
0227
0228
0229 void RecAnalyzerHF::analyze(const edm::Event& iEvent, const edm::EventSetup&) {
0230 rnnum_ = (double)iEvent.run();
0231
0232 const edm::Handle<HFPreRecHitCollection>& hf = iEvent.getHandle(tok_hfreco_);
0233 if (!hf.isValid()) {
0234 edm::LogWarning("RecAnalyzerHF") << "HcalCalibAlgos: Error! can't get hf product!";
0235 return;
0236 }
0237 const HFPreRecHitCollection Hithf = *(hf.product());
0238 edm::LogVerbatim("RecAnalyzerHF") << "HF MB size of collection " << Hithf.size();
0239 if (Hithf.size() < 1700 && nzs_) {
0240 edm::LogWarning("RecAnalyzerHF") << "HF problem " << rnnum_ << " size " << Hithf.size();
0241 }
0242
0243 bool select(false);
0244 if (!trigbit_.empty()) {
0245 const edm::Handle<L1GlobalTriggerObjectMapRecord>& gtObjectMapRecord = iEvent.getHandle(tok_hltL1GtMap_);
0246 if (gtObjectMapRecord.isValid()) {
0247 const std::vector<L1GlobalTriggerObjectMap>& objMapVec = gtObjectMapRecord->gtObjectMap();
0248 for (std::vector<L1GlobalTriggerObjectMap>::const_iterator itMap = objMapVec.begin(); itMap != objMapVec.end();
0249 ++itMap) {
0250 bool resultGt = (*itMap).algoGtlResult();
0251 if (resultGt) {
0252 int algoBit = (*itMap).algoBitNumber();
0253 if (std::find(trigbit_.begin(), trigbit_.end(), algoBit) != trigbit_.end()) {
0254 select = true;
0255 break;
0256 }
0257 }
0258 }
0259 }
0260 }
0261
0262
0263
0264 if (ignoreL1_ || (!trigbit_.empty() && select)) {
0265 analyzeHcal(Hithf, 1, true);
0266 } else if ((!ignoreL1_) && (trigbit_.empty())) {
0267 const edm::Handle<L1GlobalTriggerObjectMapRecord>& gtObjectMapRecord = iEvent.getHandle(tok_hltL1GtMap_);
0268 if (gtObjectMapRecord.isValid()) {
0269 const std::vector<L1GlobalTriggerObjectMap>& objMapVec = gtObjectMapRecord->gtObjectMap();
0270 bool ok(false);
0271 for (std::vector<L1GlobalTriggerObjectMap>::const_iterator itMap = objMapVec.begin(); itMap != objMapVec.end();
0272 ++itMap) {
0273 bool resultGt = (*itMap).algoGtlResult();
0274 if (resultGt) {
0275 int algoBit = (*itMap).algoBitNumber();
0276 analyzeHcal(Hithf, algoBit, (!ok));
0277 ok = true;
0278 }
0279 }
0280 if (!ok) {
0281 edm::LogVerbatim("RecAnalyzerHF") << "No passed L1 Trigger found";
0282 }
0283 }
0284 }
0285 }
0286
0287 void RecAnalyzerHF::analyzeHcal(const HFPreRecHitCollection& Hithf, int algoBit, bool fill) {
0288 #ifdef EDM_ML_DEBUG
0289 edm::LogVerbatim("RecAnalyzerHF") << "Enter analyzeHcal for bit " << algoBit << " Fill " << fill
0290 << " Collection size " << Hithf.size();
0291 #endif
0292
0293 for (const auto& hfItr : Hithf) {
0294 HcalDetId hid = hfItr.id();
0295 double e0 = (hfItr.getHFQIE10Info(0) == nullptr) ? 0 : hfItr.getHFQIE10Info(0)->energy();
0296 double e1 = (hfItr.getHFQIE10Info(1) == nullptr) ? 0 : hfItr.getHFQIE10Info(1)->energy();
0297 double energy = e0 + e1;
0298 if (std::abs(energy) < 1e-6)
0299 energy = (energy > 0) ? 1e-6 : -1e-6;
0300 double f1(e0), f2(e1);
0301 if (ratio_) {
0302 f1 /= energy;
0303 f2 /= energy;
0304 }
0305 #ifdef EDM_ML_DEBUG
0306 edm::LogVerbatim("RecAnalyzerHF") << hid << " E " << e0 << ":" << e1 << " F " << f1 << ":" << f2;
0307 #endif
0308 if (fill) {
0309 for (unsigned int i = 0; i < hcalID_.size(); i++) {
0310 if (hcalID_[i] == hid.rawId()) {
0311 histo_[i].first->Fill(f1);
0312 histo_[i].second->Fill(f2);
0313 break;
0314 }
0315 }
0316 hist_[0]->Fill(f1);
0317 hist_[1]->Fill(f2);
0318 }
0319
0320
0321
0322
0323 if (((noise_ || nzs_) && fabs(energy) <= 40.) || (energy >= eLowHF_ && energy <= eHighHF_)) {
0324 std::map<std::pair<int, HcalDetId>, myInfo>::iterator itr1 = myMap_.find(std::pair<int, HcalDetId>(algoBit, hid));
0325 if (itr1 == myMap_.end()) {
0326 myInfo info;
0327 myMap_[std::pair<int, HcalDetId>(algoBit, hid)] = info;
0328 itr1 = myMap_.find(std::pair<int, HcalDetId>(algoBit, hid));
0329 }
0330 itr1->second.kount += 1.0;
0331 itr1->second.f11 += (f1);
0332 itr1->second.f12 += (f1 * f1);
0333 itr1->second.f13 += (f1 * f1 * f1);
0334 itr1->second.f14 += (f1 * f1 * f1 * f1);
0335 itr1->second.f21 += (f2);
0336 itr1->second.f22 += (f2 * f2);
0337 itr1->second.f23 += (f2 * f2 * f2);
0338 itr1->second.f24 += (f2 * f2 * f2 * f2);
0339 itr1->second.runcheck = rnnum_;
0340 }
0341 }
0342 }
0343
0344
0345 #include "FWCore/Framework/interface/MakerMacros.h"
0346 DEFINE_FWK_MODULE(RecAnalyzerHF);