Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:32:40

0001 // system include files
0002 #include <iostream>
0003 #include <fstream>
0004 #include <vector>
0005 #include <map>
0006 #include <string>
0007 
0008 // user include files
0009 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0010 #include "DataFormats/HGCDigi/interface/HGCDigiCollections.h"
0011 
0012 #include "FWCore/Framework/interface/Frameworkfwd.h"
0013 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0014 #include "FWCore/Framework/interface/Event.h"
0015 #include "FWCore/Framework/interface/EventSetup.h"
0016 #include "FWCore/Framework/interface/ESHandle.h"
0017 #include "FWCore/Framework/interface/MakerMacros.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0020 #include "FWCore/ServiceRegistry/interface/Service.h"
0021 
0022 #include "Geometry/HGCalGeometry/interface/HGCalGeometry.h"
0023 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0024 
0025 #include "SimDataFormats/CaloHit/interface/PCaloHit.h"
0026 #include "SimDataFormats/CaloHit/interface/PCaloHitContainer.h"
0027 #include "DataFormats/ForwardDetId/interface/HGCSiliconDetId.h"
0028 
0029 // Root objects
0030 #include "TH1.h"
0031 #include "TH2.h"
0032 
0033 class HGCalSiliconValidation : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::SharedResources> {
0034 public:
0035   explicit HGCalSiliconValidation(const edm::ParameterSet& ps);
0036   ~HGCalSiliconValidation() override = default;
0037 
0038   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0039 
0040 protected:
0041   void beginJob() override {}
0042   void beginRun(edm::Run const&, edm::EventSetup const&) override;
0043   void endRun(edm::Run const&, edm::EventSetup const&) override {}
0044   void analyze(edm::Event const&, edm::EventSetup const&) override;
0045 
0046 private:
0047   const std::string g4Label_, nameDetector_, hgcalHits_;
0048   const edm::InputTag hgcalDigis_;
0049   const int iSample_;
0050   const edm::ESGetToken<HGCalGeometry, IdealGeometryRecord> tok_hgcalgeom_;
0051   const edm::EDGetTokenT<edm::PCaloHitContainer> tok_hits_;
0052   const edm::EDGetTokenT<HGCalDigiCollection> tok_digi_;
0053 
0054   TH1D *hsimE1_, *hsimE2_, *hsimTm_;
0055   TH1D *hsimLn_, *hdigEn_, *hdigLn_;
0056   TH2D *hsimOc_, *hsi2Oc_, *hdigOc_, *hdi2Oc_;
0057 };
0058 
0059 HGCalSiliconValidation::HGCalSiliconValidation(const edm::ParameterSet& ps)
0060     : g4Label_(ps.getUntrackedParameter<std::string>("ModuleLabel", "g4SimHits")),
0061       nameDetector_(ps.getUntrackedParameter<std::string>("detectorName", "HGCalEESensitive")),
0062       hgcalHits_((ps.getUntrackedParameter<std::string>("HitCollection", "HGCHitsEE"))),
0063       hgcalDigis_(ps.getUntrackedParameter<edm::InputTag>("DigiCollection")),
0064       iSample_(ps.getUntrackedParameter<int>("Sample", 5)),
0065       tok_hgcalgeom_(esConsumes<HGCalGeometry, IdealGeometryRecord>(edm::ESInputTag{"", nameDetector_})),
0066       tok_hits_(consumes<edm::PCaloHitContainer>(edm::InputTag(g4Label_, hgcalHits_))),
0067       tok_digi_(consumes<HGCalDigiCollection>(hgcalDigis_)) {
0068   usesResource(TFileService::kSharedResource);
0069 
0070   edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation::Input for SimHit:"
0071                                       << edm::InputTag(g4Label_, hgcalHits_) << "  Digits:" << hgcalDigis_
0072                                       << "  Sample: " << iSample_;
0073 }
0074 
0075 void HGCalSiliconValidation::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0076   edm::ParameterSetDescription desc;
0077   desc.addUntracked<std::string>("ModuleLabel", "g4SimHits");
0078   desc.addUntracked<std::string>("detectorName", "HGCalEESensitive");
0079   desc.addUntracked<std::string>("HitCollection", "HGCHitsEE");
0080   desc.addUntracked<edm::InputTag>("DigiCollection", edm::InputTag("simHGCalUnsuppressedDigis", "EE"));
0081   desc.addUntracked<int>("Sample", 5);
0082   descriptions.add("hgcalSiliconAnalysisEE", desc);
0083 }
0084 
0085 void HGCalSiliconValidation::beginRun(edm::Run const&, edm::EventSetup const& es) {
0086   edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation::Booking the Histograms";
0087 
0088   //Histograms for Sim Hits
0089   edm::Service<TFileService> fs;
0090   hsimE1_ = fs->make<TH1D>("SimHitEn1", "Sim Hit Energy", 1000, 0.0, 1.0);
0091   hsimE2_ = fs->make<TH1D>("SimHitEn2", "Sim Hit Energy", 1000, 0.0, 1.0);
0092   hsimTm_ = fs->make<TH1D>("SimHitTime", "Sim Hit Time", 1000, 0.0, 500.0);
0093   hsimLn_ = fs->make<TH1D>("SimHitLong", "Sim Hit Long. Profile", 60, 0.0, 30.0);
0094   hsimOc_ = fs->make<TH2D>("SimHitOccup", "Sim Hit Occupnacy", 300, 0.0, 300.0, 60, 0.0, 30.0);
0095   hsi2Oc_ = fs->make<TH2D>("SimHitOccu2", "Sim Hit Occupnacy", 300, 300.0, 600.0, 300, 0.0, 300.0);
0096   //Histograms for Digis
0097   hdigEn_ = fs->make<TH1D>("DigiEnergy", "Digi ADC Sample", 1000, 0.0, 1000.0);
0098   hdigLn_ = fs->make<TH1D>("DigiLong", "Digi Long. Profile", 60, 0.0, 30.0);
0099   hdigOc_ = fs->make<TH2D>("DigiOccup", "Digi Occupnacy", 300, 0.0, 300.0, 60, 0.0, 30.0);
0100   hdi2Oc_ = fs->make<TH2D>("DigiOccu2", "Digi Occupnacy", 300, 300.0, 600.0, 300, 0.0, 300.0);
0101 }
0102 
0103 void HGCalSiliconValidation::analyze(const edm::Event& e, const edm::EventSetup& iSetup) {
0104   edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation:Run = " << e.id().run()
0105                                       << " Event = " << e.id().event();
0106 
0107   const edm::ESHandle<HGCalGeometry>& geom = iSetup.getHandle(tok_hgcalgeom_);
0108   if (!geom.isValid()) {
0109     edm::LogWarning("HGCalValidation") << "Cannot get valid HGCalGeometry Object for " << nameDetector_;
0110   } else {
0111     const HGCalGeometry* geom0 = geom.product();
0112 
0113     //SimHits
0114     const edm::Handle<edm::PCaloHitContainer>& hitsCalo = e.getHandle(tok_hits_);
0115     edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation.: PCaloHitContainer obtained with flag "
0116                                         << hitsCalo.isValid();
0117     if (hitsCalo.isValid()) {
0118       edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation: PCaloHit buffer " << hitsCalo->size();
0119       unsigned i(0);
0120       std::map<unsigned int, double> map_try;
0121       for (edm::PCaloHitContainer::const_iterator it = hitsCalo->begin(); it != hitsCalo->end(); ++it) {
0122         double energy = it->energy();
0123         double time = it->time();
0124         unsigned int id = it->id();
0125         GlobalPoint pos = geom0->getPosition(DetId(id));
0126         double r = pos.perp();
0127         double z = std::abs(pos.z());
0128         int lay = HGCSiliconDetId(id).layer();
0129         hsimE1_->Fill(energy);
0130         hsimTm_->Fill(time, energy);
0131         hsimOc_->Fill(r, lay, energy);
0132         hsi2Oc_->Fill(z, r, energy);
0133         hsimLn_->Fill(lay, energy);
0134         double ensum = (map_try.count(id) != 0) ? map_try[id] : 0;
0135         ensum += energy;
0136         map_try[id] = ensum;
0137         ++i;
0138         edm::LogVerbatim("HGCalValidation") << "HGCalHit[" << i << "] ID " << std::hex << " " << id << std::dec << " "
0139                                             << HGCSiliconDetId(id) << " E " << energy << " time " << time;
0140       }
0141       for (std::map<unsigned int, double>::iterator itr = map_try.begin(); itr != map_try.end(); ++itr) {
0142         hsimE2_->Fill((*itr).second);
0143       }
0144     }
0145 
0146     //Digits
0147     unsigned int kount(0);
0148     const edm::Handle<HGCalDigiCollection>& digicoll = e.getHandle(tok_digi_);
0149     edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation.: HGCalDigiCollection obtained with flag "
0150                                         << digicoll.isValid();
0151     if (digicoll.isValid()) {
0152       edm::LogVerbatim("HGCalValidation") << "HGCalSiliconValidation: HGCalDigi buffer " << digicoll->size();
0153       for (HGCalDigiCollection::const_iterator it = digicoll->begin(); it != digicoll->end(); ++it) {
0154         HGCalDataFrame df(*it);
0155         double energy = df[iSample_].data();
0156         HGCSiliconDetId cell(df.id());
0157         GlobalPoint pos = geom0->getPosition(cell);
0158         double r = pos.perp();
0159         double z = std::abs(pos.z());
0160         int depth = cell.layer();
0161         hdigEn_->Fill(energy);
0162         hdigLn_->Fill(depth);
0163         hdigOc_->Fill(r, depth);
0164         hdi2Oc_->Fill(z, r);
0165         ++kount;
0166         edm::LogVerbatim("HGCalValidation") << "HGCalDigit[" << kount << "] ID " << cell << " E " << energy;
0167       }
0168     }
0169   }
0170 }
0171 
0172 DEFINE_FWK_MODULE(HGCalSiliconValidation);