File indexing completed on 2023-10-25 09:55:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <memory>
0022
0023
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/ESHandle.h"
0028 #include "FWCore/Framework/interface/MakerMacros.h"
0029 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0030 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0031
0032
0033 #include "DataFormats/L1Trigger/interface/EGamma.h"
0034 #include "DataFormats/L1Trigger/interface/Tau.h"
0035 #include "DataFormats/L1Trigger/interface/Jet.h"
0036 #include "DataFormats/L1Trigger/interface/Muon.h"
0037 #include "DataFormats/L1Trigger/interface/EtSum.h"
0038
0039
0040 #include "CalibFormats/CaloTPG/interface/CaloTPGTranscoder.h"
0041 #include "CalibFormats/CaloTPG/interface/CaloTPGRecord.h"
0042
0043
0044 #include "FWCore/ServiceRegistry/interface/Service.h"
0045 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0046 #include "TTree.h"
0047
0048 #include "L1Trigger/L1TNtuples/interface/L1AnalysisCaloTPDataFormat.h"
0049 #include "L1Trigger/L1TNtuples/interface/L1AnalysisL1CaloTowerDataFormat.h"
0050 #include "L1Trigger/L1TNtuples/interface/L1AnalysisL1CaloClusterDataFormat.h"
0051
0052 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0053 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0054
0055 #include "DataFormats/L1TCalorimeter/interface/CaloTower.h"
0056 #include "DataFormats/L1TCalorimeter/interface/CaloCluster.h"
0057
0058
0059
0060
0061
0062 class L1CaloTowerTreeProducer : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0063 public:
0064 explicit L1CaloTowerTreeProducer(const edm::ParameterSet&);
0065 ~L1CaloTowerTreeProducer() override = default;
0066
0067 private:
0068 void beginJob(void) override;
0069 void analyze(const edm::Event&, const edm::EventSetup&) override;
0070 void endJob() override;
0071
0072 public:
0073 L1Analysis::L1AnalysisCaloTPDataFormat* caloTPData_;
0074 L1Analysis::L1AnalysisL1CaloTowerDataFormat* l1CaloTowerData_;
0075 L1Analysis::L1AnalysisL1CaloClusterDataFormat* l1CaloClusterData_;
0076
0077 private:
0078 const double ecalLSB_;
0079 const unsigned maxCaloTP_;
0080 const unsigned maxL1Tower_;
0081 const unsigned maxL1Cluster_;
0082
0083
0084 const edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalToken_;
0085 const edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalToken_;
0086 const edm::EDGetTokenT<l1t::CaloTowerBxCollection> l1TowerToken_;
0087 const edm::ESGetToken<CaloTPGTranscoder, CaloTPGRecord> decoderToken_;
0088 edm::EDGetTokenT<l1t::CaloClusterBxCollection> l1ClusterToken_;
0089
0090
0091 edm::Service<TFileService> fs_;
0092
0093
0094 TTree* tree_;
0095
0096 bool storeCaloClusters_;
0097 };
0098
0099 L1CaloTowerTreeProducer::L1CaloTowerTreeProducer(const edm::ParameterSet& iConfig)
0100 : ecalLSB_(iConfig.getUntrackedParameter<double>("ecalLSB", 0.5)),
0101 maxCaloTP_(iConfig.getUntrackedParameter<unsigned int>("maxCaloTP", 5760)),
0102 maxL1Tower_(iConfig.getUntrackedParameter<unsigned int>("maxL1Tower", 5760)),
0103 maxL1Cluster_(iConfig.getUntrackedParameter<unsigned int>("maxL1Cluster", 5760)),
0104 ecalToken_(consumes<EcalTrigPrimDigiCollection>(iConfig.getUntrackedParameter<edm::InputTag>("ecalToken"))),
0105 hcalToken_(consumes<HcalTrigPrimDigiCollection>(iConfig.getUntrackedParameter<edm::InputTag>("hcalToken"))),
0106 l1TowerToken_(consumes<l1t::CaloTowerBxCollection>(iConfig.getUntrackedParameter<edm::InputTag>("l1TowerToken"))),
0107 decoderToken_(esConsumes<CaloTPGTranscoder, CaloTPGRecord>()) {
0108 edm::InputTag clusterTag = iConfig.getUntrackedParameter<edm::InputTag>("l1ClusterToken");
0109 storeCaloClusters_ = true;
0110 if (clusterTag.label() == std::string("") or clusterTag.label() == std::string("none"))
0111 storeCaloClusters_ = false;
0112
0113 if (clusterTag.instance() != std::string(""))
0114 l1ClusterToken_ = consumes<l1t::CaloClusterBxCollection>(clusterTag);
0115
0116 usesResource(TFileService::kSharedResource);
0117
0118
0119 tree_ = fs_->make<TTree>("L1CaloTowerTree", "L1CaloTowerTree");
0120 tree_->Branch("CaloTP", "L1Analysis::L1AnalysisCaloTPDataFormat", &caloTPData_, 32000, 3);
0121 tree_->Branch("L1CaloTower", "L1Analysis::L1AnalysisL1CaloTowerDataFormat", &l1CaloTowerData_, 32000, 3);
0122
0123 if (storeCaloClusters_)
0124 tree_->Branch("L1CaloCluster", "L1Analysis::L1AnalysisL1CaloClusterDataFormat", &l1CaloClusterData_, 32000, 3);
0125
0126 caloTPData_ = new L1Analysis::L1AnalysisCaloTPDataFormat();
0127 l1CaloTowerData_ = new L1Analysis::L1AnalysisL1CaloTowerDataFormat();
0128 l1CaloClusterData_ = new L1Analysis::L1AnalysisL1CaloClusterDataFormat();
0129 }
0130
0131
0132
0133
0134
0135
0136 void L1CaloTowerTreeProducer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0137
0138 caloTPData_->Reset();
0139
0140 edm::ESHandle<CaloTPGTranscoder> decoder;
0141 decoder = iSetup.getHandle(decoderToken_);
0142
0143 edm::Handle<EcalTrigPrimDigiCollection> ecalTPs;
0144 edm::Handle<HcalTrigPrimDigiCollection> hcalTPs;
0145
0146 iEvent.getByToken(ecalToken_, ecalTPs);
0147 iEvent.getByToken(hcalToken_, hcalTPs);
0148
0149 if (ecalTPs.isValid()) {
0150 for (const auto& itr : *(ecalTPs.product())) {
0151 short ieta = (short)itr.id().ieta();
0152
0153
0154
0155 unsigned short cal_iphi = (unsigned short)itr.id().iphi();
0156 unsigned short iphi = (72 + 18 - cal_iphi) % 72;
0157 unsigned short compEt = itr.compressedEt();
0158 double et = ecalLSB_ * compEt;
0159 unsigned short fineGrain = (unsigned short)itr.fineGrain();
0160
0161 if (compEt > 0) {
0162 caloTPData_->ecalTPieta.push_back(ieta);
0163 caloTPData_->ecalTPCaliphi.push_back(cal_iphi);
0164 caloTPData_->ecalTPiphi.push_back(iphi);
0165 caloTPData_->ecalTPet.push_back(et);
0166 caloTPData_->ecalTPcompEt.push_back(compEt);
0167 caloTPData_->ecalTPfineGrain.push_back(fineGrain);
0168 caloTPData_->nECALTP++;
0169 }
0170 }
0171
0172 } else {
0173 edm::LogWarning("L1TNtuple") << "ECAL TPs not found, branch will not be filled";
0174 }
0175
0176 if (hcalTPs.isValid()) {
0177 for (auto itr : (*hcalTPs.product())) {
0178 int ver = itr.id().version();
0179 short ieta = (short)itr.id().ieta();
0180 unsigned short absIeta = (unsigned short)abs(ieta);
0181
0182
0183 unsigned short cal_iphi = (unsigned short)itr.id().iphi();
0184 unsigned short iphi = (72 + 18 - cal_iphi) % 72;
0185
0186 unsigned short compEt = itr.SOI_compressedEt();
0187 double et = decoder->hcaletValue(itr.id(), itr.t0());
0188
0189 unsigned short fineGrain = (unsigned short)itr.SOI_fineGrain();
0190
0191 if (compEt > 0 && (absIeta < 29 || ver == 1)) {
0192 caloTPData_->hcalTPieta.push_back(ieta);
0193 caloTPData_->hcalTPCaliphi.push_back(cal_iphi);
0194 caloTPData_->hcalTPiphi.push_back(iphi);
0195 caloTPData_->hcalTPet.push_back(et);
0196 caloTPData_->hcalTPcompEt.push_back(compEt);
0197 caloTPData_->hcalTPfineGrain.push_back(fineGrain);
0198 caloTPData_->nHCALTP++;
0199 }
0200 }
0201
0202 } else {
0203 edm::LogWarning("L1TNtuple") << "HCAL TPs not found, branch will not be filled";
0204 }
0205
0206
0207 l1CaloTowerData_->Reset();
0208
0209 edm::Handle<l1t::CaloTowerBxCollection> l1Towers;
0210 iEvent.getByToken(l1TowerToken_, l1Towers);
0211
0212 if (l1Towers.isValid()) {
0213 for (int ibx = l1Towers->getFirstBX(); ibx <= l1Towers->getLastBX(); ++ibx) {
0214 for (auto itr = l1Towers->begin(ibx); itr != l1Towers->end(ibx); ++itr) {
0215 if (itr->hwPt() <= 0)
0216 continue;
0217
0218
0219 l1CaloTowerData_->et.push_back(itr->pt());
0220 l1CaloTowerData_->eta.push_back(itr->eta());
0221 l1CaloTowerData_->phi.push_back(itr->phi());
0222 l1CaloTowerData_->iet.push_back(itr->hwPt());
0223 l1CaloTowerData_->ieta.push_back(itr->hwEta());
0224 l1CaloTowerData_->iphi.push_back(itr->hwPhi());
0225 l1CaloTowerData_->iem.push_back(itr->hwEtEm());
0226 l1CaloTowerData_->ihad.push_back(itr->hwEtHad());
0227 l1CaloTowerData_->iratio.push_back(itr->hwEtRatio());
0228 l1CaloTowerData_->iqual.push_back(itr->hwQual());
0229
0230 l1CaloTowerData_->nTower++;
0231 }
0232 }
0233
0234 } else {
0235 edm::LogWarning("L1TNtuple") << "L1 Calo Towerss not found, branch will not be filled";
0236 }
0237
0238
0239 if (storeCaloClusters_) {
0240 l1CaloClusterData_->Reset();
0241
0242 edm::Handle<l1t::CaloClusterBxCollection> l1Clusters;
0243 if (!l1ClusterToken_.isUninitialized())
0244 iEvent.getByToken(l1ClusterToken_, l1Clusters);
0245
0246 if (l1Clusters.isValid()) {
0247 for (int ibx = l1Clusters->getFirstBX(); ibx <= l1Clusters->getLastBX(); ++ibx) {
0248 for (auto itr = l1Clusters->begin(ibx); itr != l1Clusters->end(ibx); ++itr) {
0249 if (itr->hwPt() <= 0)
0250 continue;
0251
0252
0253 l1CaloClusterData_->et.push_back(itr->pt());
0254 l1CaloClusterData_->eta.push_back(itr->eta());
0255 l1CaloClusterData_->phi.push_back(itr->phi());
0256 l1CaloClusterData_->iet.push_back(itr->hwPt());
0257 l1CaloClusterData_->ieta.push_back(itr->hwEta());
0258 l1CaloClusterData_->iphi.push_back(itr->hwPhi());
0259 l1CaloClusterData_->iqual.push_back(itr->hwQual());
0260
0261 l1CaloClusterData_->nCluster++;
0262 }
0263 }
0264
0265 } else {
0266 edm::LogWarning("L1TNtuple") << "L1 Calo Clusters not found, branch will not be filled";
0267 }
0268 }
0269
0270 tree_->Fill();
0271 }
0272
0273
0274 void L1CaloTowerTreeProducer::beginJob(void) {}
0275
0276
0277 void L1CaloTowerTreeProducer::endJob() {}
0278
0279
0280 DEFINE_FWK_MODULE(L1CaloTowerTreeProducer);