Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2022-04-20 11:34:15

0001 // system include files
0002 #include <memory>
0003 #include <iostream>
0004 #include <string>
0005 #include <vector>
0006 
0007 // user include files
0008 #include "FWCore/Framework/interface/Frameworkfwd.h"
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "FWCore/Framework/interface/ESHandle.h"
0011 #include "DataFormats/Common/interface/Handle.h"
0012 #include "FWCore/Framework/interface/MakerMacros.h"
0013 #include "FWCore/ServiceRegistry/interface/Service.h"
0014 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0015 #include "FWCore/Common/interface/Provenance.h"
0016 
0017 #include <DQMServices/Core/interface/DQMStore.h>
0018 #include "DQMServices/Core/interface/DQMGlobalEDAnalyzer.h"
0019 
0020 #include "DataFormats/ForwardDetId/interface/HGCalDetId.h"
0021 #include "DataFormats/L1THGCal/interface/HGCalTriggerCell.h"
0022 #include "DataFormats/L1THGCal/interface/HGCalCluster.h"
0023 #include "DataFormats/L1THGCal/interface/HGCalMulticluster.h"
0024 #include "DataFormats/L1THGCal/interface/HGCalTower.h"
0025 
0026 #include "Geometry/Records/interface/CaloGeometryRecord.h"
0027 #include "L1Trigger/L1THGCal/interface/HGCalTriggerGeometryBase.h"
0028 #include "L1Trigger/L1THGCal/interface/HGCalTriggerTools.h"
0029 #include "L1Trigger/L1THGCal/interface/backend/HGCalTriggerClusterIdentificationBase.h"
0030 
0031 //
0032 // class declaration
0033 //
0034 
0035 struct Histograms {
0036   //histogram tc related
0037   dqm::reco::MonitorElement *h_tc_n_;
0038   dqm::reco::MonitorElement *h_tc_mipPt_;
0039   dqm::reco::MonitorElement *h_tc_pt_;
0040   dqm::reco::MonitorElement *h_tc_energy_;
0041   dqm::reco::MonitorElement *h_tc_eta_;
0042   dqm::reco::MonitorElement *h_tc_phi_;
0043   dqm::reco::MonitorElement *h_tc_x_;
0044   dqm::reco::MonitorElement *h_tc_y_;
0045   dqm::reco::MonitorElement *h_tc_z_;
0046   dqm::reco::MonitorElement *h_tc_layer_;
0047 
0048   //histogram cl related
0049   dqm::reco::MonitorElement *h_cl_n_;
0050   dqm::reco::MonitorElement *h_cl_mipPt_;
0051   dqm::reco::MonitorElement *h_cl_pt_;
0052   dqm::reco::MonitorElement *h_cl_energy_;
0053   dqm::reco::MonitorElement *h_cl_eta_;
0054   dqm::reco::MonitorElement *h_cl_phi_;
0055   dqm::reco::MonitorElement *h_cl_layer_;
0056   dqm::reco::MonitorElement *h_cl_cells_n_;
0057 
0058   //histogram multicl related
0059   dqm::reco::MonitorElement *h_cl3d_n_;
0060   dqm::reco::MonitorElement *h_cl3d_pt_;
0061   dqm::reco::MonitorElement *h_cl3d_energy_;
0062   dqm::reco::MonitorElement *h_cl3d_eta_;
0063   dqm::reco::MonitorElement *h_cl3d_phi_;
0064   dqm::reco::MonitorElement *h_cl3d_clusters_n_;
0065   // cluster shower shapes
0066   dqm::reco::MonitorElement *h_cl3d_showerlength_;
0067   dqm::reco::MonitorElement *h_cl3d_coreshowerlength_;
0068   dqm::reco::MonitorElement *h_cl3d_firstlayer_;
0069   dqm::reco::MonitorElement *h_cl3d_maxlayer_;
0070   dqm::reco::MonitorElement *h_cl3d_seetot_;
0071   dqm::reco::MonitorElement *h_cl3d_seemax_;
0072   dqm::reco::MonitorElement *h_cl3d_spptot_;
0073   dqm::reco::MonitorElement *h_cl3d_sppmax_;
0074   dqm::reco::MonitorElement *h_cl3d_szz_;
0075   dqm::reco::MonitorElement *h_cl3d_srrtot_;
0076   dqm::reco::MonitorElement *h_cl3d_srrmax_;
0077   dqm::reco::MonitorElement *h_cl3d_srrmean_;
0078   dqm::reco::MonitorElement *h_cl3d_emaxe_;
0079   dqm::reco::MonitorElement *h_cl3d_bdteg_;
0080   dqm::reco::MonitorElement *h_cl3d_quality_;
0081 
0082   //histogram tower related
0083   dqm::reco::MonitorElement *h_tower_n_;
0084   dqm::reco::MonitorElement *h_tower_pt_;
0085   dqm::reco::MonitorElement *h_tower_energy_;
0086   dqm::reco::MonitorElement *h_tower_eta_;
0087   dqm::reco::MonitorElement *h_tower_phi_;
0088   dqm::reco::MonitorElement *h_tower_etEm_;
0089   dqm::reco::MonitorElement *h_tower_etHad_;
0090   dqm::reco::MonitorElement *h_tower_iEta_;
0091   dqm::reco::MonitorElement *h_tower_iPhi_;
0092 };
0093 
0094 class HGCalTriggerValidator : public DQMGlobalEDAnalyzer<Histograms> {
0095 public:
0096   explicit HGCalTriggerValidator(const edm::ParameterSet &);
0097   ~HGCalTriggerValidator() override = default;
0098 
0099 private:
0100   void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &, Histograms &) const override;
0101   void dqmAnalyze(edm::Event const &, edm::EventSetup const &, Histograms const &) const override;
0102 
0103 private:
0104   // ----------member data ---------------------------
0105   const edm::EDGetToken trigger_cells_token_;
0106   const edm::EDGetToken clusters_token_;
0107   const edm::EDGetToken multiclusters_token_;
0108   const edm::EDGetToken towers_token_;
0109   const edm::ESGetToken<HGCalTriggerGeometryBase, CaloGeometryRecord> trigGeom_token_;
0110 
0111   std::unique_ptr<HGCalTriggerClusterIdentificationBase> id_;
0112 
0113   std::shared_ptr<HGCalTriggerTools> triggerTools_;
0114 };
0115 
0116 HGCalTriggerValidator::HGCalTriggerValidator(const edm::ParameterSet &iConfig)
0117     : trigger_cells_token_{consumes<l1t::HGCalTriggerCellBxCollection>(
0118           iConfig.getParameter<edm::InputTag>("TriggerCells"))},
0119       clusters_token_{consumes<l1t::HGCalClusterBxCollection>(iConfig.getParameter<edm::InputTag>("Clusters"))},
0120       multiclusters_token_{
0121           consumes<l1t::HGCalMulticlusterBxCollection>(iConfig.getParameter<edm::InputTag>("Multiclusters"))},
0122       towers_token_{consumes<l1t::HGCalTowerBxCollection>(iConfig.getParameter<edm::InputTag>("Towers"))},
0123       trigGeom_token_(esConsumes()),
0124       id_{HGCalTriggerClusterIdentificationFactory::get()->create("HGCalTriggerClusterIdentificationBDT")} {
0125   id_->initialize(iConfig.getParameter<edm::ParameterSet>("EGIdentification"));
0126   triggerTools_ = std::make_shared<HGCalTriggerTools>();
0127 }
0128 
0129 void HGCalTriggerValidator::bookHistograms(DQMStore::IBooker &iBooker,
0130                                            edm::Run const &,
0131                                            edm::EventSetup const &iSetup,
0132                                            Histograms &histograms) const {
0133   iBooker.cd();
0134   iBooker.setCurrentFolder("HGCALTPG");
0135 
0136   //initiating histograms
0137   // trigger cells
0138   histograms.h_tc_n_ = iBooker.book1D("tc_n", "trigger cell number; number", 400, 0, 400);
0139   histograms.h_tc_mipPt_ = iBooker.book1D("tc_mipPt", "trigger cell mipPt; mipPt", 400, 0, 400);
0140   histograms.h_tc_pt_ = iBooker.book1D("tc_pt", "trigger cell pt; pt [GeV]", 15, 0, 15);
0141   histograms.h_tc_energy_ = iBooker.book1D("tc_energy", "trigger cell energy; energy [GeV]", 70, 0, 70);
0142   histograms.h_tc_eta_ = iBooker.book1D("tc_eta", "trigger cell eta; eta", 60, -3.14, 3.14);
0143   histograms.h_tc_phi_ = iBooker.book1D("tc_phi", "trigger cell phi; phi", 60, -3.14, 3.14);
0144   histograms.h_tc_x_ = iBooker.book1D("tc_x", "trigger cell x; x [cm]", 500, -250, 250);
0145   histograms.h_tc_y_ = iBooker.book1D("tc_y", "trigger cell y; y [cm]", 500, -250, 250);
0146   histograms.h_tc_z_ = iBooker.book1D("tc_z", "trigger cell z; z [cm]", 1100, -550, 550);
0147   histograms.h_tc_layer_ = iBooker.book1D("tc_layer", "trigger cell layer; layer", 50, 0, 50);
0148 
0149   // cluster 2D histograms
0150   histograms.h_cl_n_ = iBooker.book1D("cl_n", "cluster2D number; number", 80, 0, 80);
0151   histograms.h_cl_mipPt_ = iBooker.book1D("cl_mipPt", "cluster2D mipPt; mipPt", 600, 0, 600);
0152   histograms.h_cl_pt_ = iBooker.book1D("cl_pt", "cluster2D pt; pt [GeV]", 20, 0, 20);
0153   histograms.h_cl_energy_ = iBooker.book1D("cl_energy", "cluster2D energy; energy [GeV]", 80, 0, 80);
0154   histograms.h_cl_eta_ = iBooker.book1D("cl_eta", "cluster2D eta; eta", 60, -3.14, 3.14);
0155   histograms.h_cl_phi_ = iBooker.book1D("cl_phi", "cluster2D phi; phi", 60, -3.14, 3.14);
0156   histograms.h_cl_cells_n_ = iBooker.book1D("cl_cells_n", "cluster2D cells_n; cells_n", 16, 0, 16);
0157   histograms.h_cl_layer_ = iBooker.book1D("cl_layer", "cluster2D layer; layer", 50, 0, 50);
0158 
0159   // multiclusters
0160   histograms.h_cl3d_n_ = iBooker.book1D("cl3d_n", "cl3duster3D number; number", 12, 0, 12);
0161   histograms.h_cl3d_pt_ = iBooker.book1D("cl3d_pt", "cl3duster3D pt; pt [GeV]", 50, 0, 50);
0162   histograms.h_cl3d_energy_ = iBooker.book1D("cl3d_energy", "cl3duster3D energy; energy [GeV]", 80, 0, 80);
0163   histograms.h_cl3d_eta_ = iBooker.book1D("cl3d_eta", "cl3duster3D eta; eta", 60, -3.14, 3.14);
0164   histograms.h_cl3d_phi_ = iBooker.book1D("cl3d_phi", "cl3duster3D phi; phi", 60, -3.14, 3.14);
0165   histograms.h_cl3d_clusters_n_ = iBooker.book1D("cl3d_clusters_n", "cl3duster3D clusters_n; clusters_n", 30, 0, 30);
0166   // cluster shower shapes
0167   histograms.h_cl3d_showerlength_ =
0168       iBooker.book1D("cl3d_showerlength", "cl3duster3D showerlength; showerlength", 50, 0, 50);
0169   histograms.h_cl3d_coreshowerlength_ =
0170       iBooker.book1D("cl3d_coreshowerlength", "cl3duster3D coreshowerlength; coreshowerlength", 16, 0, 16);
0171   histograms.h_cl3d_firstlayer_ = iBooker.book1D("cl3d_firstlayer", "cl3duster3D firstlayer; firstlayer", 50, 0, 50);
0172   histograms.h_cl3d_maxlayer_ = iBooker.book1D("cl3d_maxlayer", "cl3duster3D maxlayer; maxlayer", 50, 0, 50);
0173   histograms.h_cl3d_seetot_ = iBooker.book1D("cl3d_seetot", "cl3duster3D seetot; seetot", 50, 0, 0.05);
0174   histograms.h_cl3d_seemax_ = iBooker.book1D("cl3d_seemax", "cl3duster3D seemax; seemax", 40, 0, 0.04);
0175   histograms.h_cl3d_spptot_ = iBooker.book1D("cl3d_spptot", "cl3duster3D spptot; spptot", 800, 0, 0.08);
0176   histograms.h_cl3d_sppmax_ = iBooker.book1D("cl3d_sppmax", "cl3duster3D sppmax; sppmax", 800, 0, 0.08);
0177   histograms.h_cl3d_szz_ = iBooker.book1D("cl3d_szz", "cl3duster3D szz; szz", 50, 0, 50);
0178   histograms.h_cl3d_srrtot_ = iBooker.book1D("cl3d_srrtot", "cl3duster3D srrtot; srrtot", 800, 0, 0.008);
0179   histograms.h_cl3d_srrmax_ = iBooker.book1D("cl3d_srrmax", "cl3duster3D srrmax; srrmax", 900, 0, 0.009);
0180   histograms.h_cl3d_srrmean_ = iBooker.book1D("cl3d_srrmean", "cl3duster3D srrmean; srrmean", 800, 0, 0.008);
0181   histograms.h_cl3d_emaxe_ = iBooker.book1D("cl3d_emaxe", "cl3duster3D emaxe; emaxe", 15, 0, 1.5);
0182   histograms.h_cl3d_bdteg_ = iBooker.book1D("cl3d_bdteg", "cl3duster3D bdteg; bdteg", 30, -0.7, 0.4);
0183   histograms.h_cl3d_quality_ = iBooker.book1D("cl3d_quality", "cl3duster3D quality; quality", 20, 0, 2);
0184 
0185   // towers
0186   histograms.h_tower_n_ = iBooker.book1D("tower_n", "tower n; number", 400, 1200, 1600);
0187   histograms.h_tower_pt_ = iBooker.book1D("tower_pt", "tower pt; pt [GeV]", 50, 0, 50);
0188   histograms.h_tower_energy_ = iBooker.book1D("tower_energy", "tower energy; energy [GeV]", 200, 0, 200);
0189   histograms.h_tower_eta_ = iBooker.book1D("tower_eta", "tower eta; eta", 60, -3.14, 3.14);
0190   histograms.h_tower_phi_ = iBooker.book1D("tower_phi", "tower phi; phi", 60, -3.14, 3.14);
0191   histograms.h_tower_etEm_ = iBooker.book1D("tower_etEm", "tower etEm; etEm", 50, 0, 50);
0192   histograms.h_tower_etHad_ = iBooker.book1D("tower_etHad", "tower etHad; etHad", 30, 0, 0.3);
0193   histograms.h_tower_iEta_ = iBooker.book1D("tower_iEta", "tower iEta; iEta", 20, 0, 20);
0194   histograms.h_tower_iPhi_ = iBooker.book1D("tower_iPhi", "tower iPhi; iPhi", 80, 0, 80);
0195 }
0196 
0197 void HGCalTriggerValidator::dqmAnalyze(edm::Event const &iEvent,
0198                                        edm::EventSetup const &iSetup,
0199                                        Histograms const &histograms) const {
0200   int tc_n = 0;
0201   int cl_n = 0;
0202   int cl3d_n = 0;
0203   int tower_n = 0;
0204 
0205   triggerTools_->eventSetup(iSetup, trigGeom_token_);
0206 
0207   // retrieve trigger cells
0208   edm::Handle<l1t::HGCalTriggerCellBxCollection> trigger_cells_h;
0209   iEvent.getByToken(trigger_cells_token_, trigger_cells_h);
0210   const l1t::HGCalTriggerCellBxCollection &trigger_cells = *trigger_cells_h;
0211 
0212   if (trigger_cells_h.isValid()) {
0213     for (auto tc_itr = trigger_cells.begin(0); tc_itr != trigger_cells.end(0); tc_itr++) {
0214       tc_n++;
0215       HGCalDetId id(tc_itr->detId());
0216       histograms.h_tc_pt_->Fill(tc_itr->pt());
0217       histograms.h_tc_mipPt_->Fill(tc_itr->mipPt());
0218       histograms.h_tc_energy_->Fill(tc_itr->energy());
0219       histograms.h_tc_eta_->Fill(tc_itr->eta());
0220       histograms.h_tc_phi_->Fill(tc_itr->phi());
0221       histograms.h_tc_x_->Fill(tc_itr->position().x());
0222       histograms.h_tc_y_->Fill(tc_itr->position().y());
0223       histograms.h_tc_z_->Fill(tc_itr->position().z());
0224       histograms.h_tc_layer_->Fill(triggerTools_->layerWithOffset(id));
0225     }
0226   }
0227   histograms.h_tc_n_->Fill(tc_n);
0228 
0229   // retrieve clusters
0230   edm::Handle<l1t::HGCalClusterBxCollection> clusters_h;
0231   iEvent.getByToken(clusters_token_, clusters_h);
0232   const l1t::HGCalClusterBxCollection &clusters = *clusters_h;
0233 
0234   if (clusters_h.isValid()) {
0235     for (auto cl_itr = clusters.begin(0); cl_itr != clusters.end(0); cl_itr++) {
0236       cl_n++;
0237       histograms.h_cl_mipPt_->Fill(cl_itr->mipPt());
0238       histograms.h_cl_pt_->Fill(cl_itr->pt());
0239       histograms.h_cl_energy_->Fill(cl_itr->energy());
0240       histograms.h_cl_eta_->Fill(cl_itr->eta());
0241       histograms.h_cl_phi_->Fill(cl_itr->phi());
0242       histograms.h_cl_layer_->Fill(triggerTools_->layerWithOffset(cl_itr->detId()));
0243       histograms.h_cl_cells_n_->Fill(cl_itr->constituents().size());
0244     }
0245   }
0246   histograms.h_cl_n_->Fill(cl_n);
0247 
0248   // retrieve clusters 3D
0249   edm::Handle<l1t::HGCalMulticlusterBxCollection> multiclusters_h;
0250   iEvent.getByToken(multiclusters_token_, multiclusters_h);
0251   const l1t::HGCalMulticlusterBxCollection &multiclusters = *multiclusters_h;
0252 
0253   if (multiclusters_h.isValid()) {
0254     for (auto cl3d_itr = multiclusters.begin(0); cl3d_itr != multiclusters.end(0); cl3d_itr++) {
0255       cl3d_n++;
0256       histograms.h_cl3d_pt_->Fill(cl3d_itr->pt());
0257       histograms.h_cl3d_energy_->Fill(cl3d_itr->energy());
0258       histograms.h_cl3d_eta_->Fill(cl3d_itr->eta());
0259       histograms.h_cl3d_phi_->Fill(cl3d_itr->phi());
0260       histograms.h_cl3d_clusters_n_->Fill(cl3d_itr->constituents().size());
0261       // cluster shower shapes
0262       histograms.h_cl3d_showerlength_->Fill(cl3d_itr->showerLength());
0263       histograms.h_cl3d_coreshowerlength_->Fill(cl3d_itr->coreShowerLength());
0264       histograms.h_cl3d_firstlayer_->Fill(cl3d_itr->firstLayer());
0265       histograms.h_cl3d_maxlayer_->Fill(cl3d_itr->maxLayer());
0266       histograms.h_cl3d_seetot_->Fill(cl3d_itr->sigmaEtaEtaTot());
0267       histograms.h_cl3d_seemax_->Fill(cl3d_itr->sigmaEtaEtaMax());
0268       histograms.h_cl3d_spptot_->Fill(cl3d_itr->sigmaPhiPhiTot());
0269       histograms.h_cl3d_sppmax_->Fill(cl3d_itr->sigmaPhiPhiMax());
0270       histograms.h_cl3d_szz_->Fill(cl3d_itr->sigmaZZ());
0271       histograms.h_cl3d_srrtot_->Fill(cl3d_itr->sigmaRRTot());
0272       histograms.h_cl3d_srrmax_->Fill(cl3d_itr->sigmaRRMax());
0273       histograms.h_cl3d_srrmean_->Fill(cl3d_itr->sigmaRRMean());
0274       histograms.h_cl3d_emaxe_->Fill(cl3d_itr->eMax() / cl3d_itr->energy());
0275       histograms.h_cl3d_bdteg_->Fill(id_->value(*cl3d_itr));
0276       histograms.h_cl3d_quality_->Fill(cl3d_itr->hwQual());
0277     }
0278   }
0279   histograms.h_cl3d_n_->Fill(cl3d_n);
0280 
0281   // retrieve towers
0282   edm::Handle<l1t::HGCalTowerBxCollection> towers_h;
0283   iEvent.getByToken(towers_token_, towers_h);
0284   const l1t::HGCalTowerBxCollection &towers = *towers_h;
0285 
0286   if (towers_h.isValid()) {
0287     for (auto tower_itr = towers.begin(0); tower_itr != towers.end(0); tower_itr++) {
0288       tower_n++;
0289       histograms.h_tower_pt_->Fill(tower_itr->pt());
0290       histograms.h_tower_energy_->Fill(tower_itr->energy());
0291       histograms.h_tower_eta_->Fill(tower_itr->eta());
0292       histograms.h_tower_phi_->Fill(tower_itr->phi());
0293       histograms.h_tower_etEm_->Fill(tower_itr->etEm());
0294       histograms.h_tower_etHad_->Fill(tower_itr->etHad());
0295       histograms.h_tower_iEta_->Fill(tower_itr->id().iEta());
0296       histograms.h_tower_iPhi_->Fill(tower_itr->id().iPhi());
0297     }
0298   }
0299   histograms.h_tower_n_->Fill(tower_n);
0300 }
0301 
0302 #include "FWCore/Framework/interface/MakerMacros.h"
0303 
0304 //define this as a plug-in
0305 DEFINE_FWK_MODULE(HGCalTriggerValidator);