Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:08:57

0001 // -*- C++ -*-
0002 //bookLayer
0003 // Package:    Phase2ITMonitorCluster
0004 // Class:      Phase2ITMonitorCluster
0005 //
0006 /**\class Phase2ITMonitorCluster Phase2ITMonitorCluster.cc 
0007 
0008  Description: DQM plots tracker clusters. 
0009 
0010 */
0011 //
0012 // Author: Gabriel Ramirez
0013 // Date: May 23, 2020
0014 #include <memory>
0015 #include "FWCore/Framework/interface/MakerMacros.h"
0016 #include "FWCore/Framework/interface/ESWatcher.h"
0017 #include "FWCore/Framework/interface/Frameworkfwd.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0020 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0021 #include "FWCore/Framework/interface/Event.h"
0022 #include "FWCore/Framework/interface/ESHandle.h"
0023 #include "FWCore/ServiceRegistry/interface/Service.h"
0024 #include "FWCore/Utilities/interface/InputTag.h"
0025 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0026 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0027 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0028 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0029 #include "DataFormats/Common/interface/DetSetVector.h"
0030 #include "DataFormats/Common/interface/Handle.h"
0031 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0032 #include "DataFormats/DetId/interface/DetId.h"
0033 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0034 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0035 // DQM Histograming
0036 #include "DQMServices/Core/interface/MonitorElement.h"
0037 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0038 #include "DQMServices/Core/interface/DQMStore.h"
0039 
0040 class Phase2ITMonitorCluster : public DQMEDAnalyzer {
0041 public:
0042   explicit Phase2ITMonitorCluster(const edm::ParameterSet&);
0043   ~Phase2ITMonitorCluster() override;
0044   void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
0045   void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0046   void dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) override;
0047   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0048 
0049 private:
0050   struct ClusterMEs {
0051     MonitorElement* nClusters = nullptr;
0052     MonitorElement* ClusterSize = nullptr;
0053     MonitorElement* ClusterSizeX = nullptr;
0054     MonitorElement* ClusterSizeY = nullptr;
0055     MonitorElement* ClusterCharge = nullptr;
0056     MonitorElement* XYGlobalPositionMapPixel = nullptr;
0057     MonitorElement* XYLocalPositionMapPixel = nullptr;
0058   };
0059 
0060   MonitorElement* numberClusters_;
0061   MonitorElement* globalXY_barrel_;
0062   MonitorElement* globalXY_endcap_;
0063   MonitorElement* globalRZ_barrel_;
0064   MonitorElement* globalRZ_endcap_;
0065 
0066   void bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_it, std::string& subdir);
0067 
0068   std::map<std::string, ClusterMEs> layerMEs_;
0069   edm::ParameterSet config_;
0070   edm::EDGetTokenT<edmNew::DetSetVector<SiPixelCluster>> itPixelClusterToken_;
0071   const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0072   const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
0073   const TrackerGeometry* tkGeom_ = nullptr;
0074   const TrackerTopology* tTopo_ = nullptr;
0075 };
0076 #include "DQM/SiTrackerPhase2/interface/TrackerPhase2DQMUtil.h"
0077 //
0078 // constructors
0079 //
0080 Phase2ITMonitorCluster::Phase2ITMonitorCluster(const edm::ParameterSet& iConfig)
0081     : config_(iConfig),
0082       itPixelClusterToken_(consumes<edmNew::DetSetVector<SiPixelCluster>>(
0083           config_.getParameter<edm::InputTag>("InnerPixelClusterSource"))),
0084       geomToken_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, edm::Transition::BeginRun>()),
0085       topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()) {
0086   edm::LogInfo("Phase2ITMonitorCluster") << ">>> Construct Phase2ITMonitorCluster ";
0087 }
0088 
0089 Phase2ITMonitorCluster::~Phase2ITMonitorCluster() {
0090   edm::LogInfo("Phase2ITMonitorCluster") << ">>> Destroy Phase2ITMonitorCluster ";
0091 }
0092 //
0093 // -- DQM Begin Run
0094 void Phase2ITMonitorCluster::dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0095   tkGeom_ = &iSetup.getData(geomToken_);
0096   tTopo_ = &iSetup.getData(topoToken_);
0097 }
0098 
0099 //
0100 // -- Analyze
0101 //
0102 void Phase2ITMonitorCluster::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0103   // Getting the clusters
0104   const auto& itPixelClusterHandle = iEvent.getHandle(itPixelClusterToken_);
0105 
0106   if (!itPixelClusterHandle.isValid()) {
0107     edm::LogWarning("Phase2ITMonitorCluster") << "No SiPixelCluster Collection found in the event. Skipping!";
0108     return;
0109   }
0110 
0111   // Number of clusters
0112   std::map<std::string, unsigned int> nClsmap;
0113   unsigned int nclusGlobal = 0;
0114   for (const auto& DSVItr : *itPixelClusterHandle) {
0115     uint32_t rawid(DSVItr.detId());
0116     DetId detId(rawid);
0117     const GeomDet* geomDet = tkGeom_->idToDet(detId);
0118     if (!geomDet)
0119       continue;
0120     const GeomDetUnit* geomDetUnit(tkGeom_->idToDetUnit(detId));
0121     if (!geomDetUnit)
0122       continue;
0123     nclusGlobal += DSVItr.size();
0124     std::string folderkey = phase2tkutil::getITHistoId(detId, tTopo_);
0125     // initialize the nhit counters if they don't exist for this layer
0126     auto counterDet = nClsmap.find(folderkey);
0127     if (counterDet == nClsmap.end()) {
0128       nClsmap.emplace(folderkey, DSVItr.size());
0129     } else
0130       counterDet->second += DSVItr.size();
0131     for (const auto& clusterItr : DSVItr) {
0132       MeasurementPoint mpCluster(clusterItr.x(), clusterItr.y());
0133       Local3DPoint localPosCluster = geomDetUnit->topology().localPosition(mpCluster);
0134       Global3DPoint globalPosCluster = geomDetUnit->surface().toGlobal(localPosCluster);
0135       double gx = globalPosCluster.x() * 10.;
0136       double gy = globalPosCluster.y() * 10.;
0137       double gz = globalPosCluster.z() * 10.;
0138       double gr = globalPosCluster.perp() * 10.;
0139 
0140       // cluster size
0141       if (geomDetUnit->subDetector() == GeomDetEnumerators::SubDetector::P2PXB) {
0142         globalXY_barrel_->Fill(gx, gy);
0143         globalRZ_barrel_->Fill(gz, gr);
0144       } else if (geomDetUnit->subDetector() == GeomDetEnumerators::SubDetector::P2PXEC) {
0145         globalXY_endcap_->Fill(gx, gy);
0146         globalRZ_endcap_->Fill(gz, gr);
0147       }
0148       auto local_mesIT = layerMEs_.find(folderkey);
0149       if (local_mesIT == layerMEs_.end())
0150         continue;
0151       ClusterMEs& local_mes = local_mesIT->second;
0152       if (local_mes.XYGlobalPositionMapPixel)  //make this optional
0153         local_mes.XYGlobalPositionMapPixel->Fill(globalPosCluster.z(), globalPosCluster.perp());
0154       local_mes.XYLocalPositionMapPixel->Fill(localPosCluster.x(), localPosCluster.y());
0155       local_mes.ClusterSize->Fill(clusterItr.size());
0156       local_mes.ClusterSizeX->Fill(clusterItr.sizeX());
0157       local_mes.ClusterSizeY->Fill(clusterItr.sizeY());
0158       local_mes.ClusterCharge->Fill(clusterItr.charge());
0159     }
0160   }
0161 
0162   for (const auto& it : nClsmap) {
0163     if (layerMEs_.find(it.first) == layerMEs_.end())
0164       continue;
0165     layerMEs_[it.first].nClusters->Fill(it.second);
0166   }
0167   numberClusters_->Fill(nclusGlobal);  //global histo of #clusters
0168 }
0169 
0170 //
0171 // -- Book Histograms
0172 //
0173 void Phase2ITMonitorCluster::bookHistograms(DQMStore::IBooker& ibooker,
0174                                             edm::Run const& iRun,
0175                                             edm::EventSetup const& iSetup) {
0176   std::string top_folder = config_.getParameter<std::string>("TopFolderName");
0177   std::stringstream folder_name;
0178 
0179   ibooker.cd();
0180   folder_name << top_folder << "/";
0181   ibooker.setCurrentFolder(folder_name.str());
0182 
0183   edm::LogInfo("Phase2ITMonitorCluster") << " Booking Histograms in: " << folder_name.str();
0184 
0185   numberClusters_ = phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalNClusters"), ibooker);
0186 
0187   globalXY_barrel_ =
0188       phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_PXB"), ibooker);
0189 
0190   globalRZ_barrel_ =
0191       phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionRZ_PXB"), ibooker);
0192 
0193   globalXY_endcap_ =
0194       phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_PXEC"), ibooker);
0195 
0196   globalRZ_endcap_ =
0197       phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionRZ_PXEC"), ibooker);
0198 
0199   //Now book layer wise histos
0200   edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0201   if (theTkDigiGeomWatcher.check(iSetup)) {
0202     for (auto const& det_u : tkGeom_->detUnits()) {
0203       //Always check TrackerNumberingBuilder before changing this part
0204       if (!(det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXB ||
0205             det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXEC))
0206         continue;
0207       unsigned int detId_raw = det_u->geographicalId().rawId();
0208       edm::LogInfo("Phase2ITMonitorRecHit") << "Detid:" << detId_raw << "\tsubdet=" << det_u->subDetector()
0209                                             << "\t key=" << phase2tkutil::getITHistoId(detId_raw, tTopo_) << std::endl;
0210       bookLayerHistos(ibooker, detId_raw, top_folder);
0211     }
0212   }
0213 }
0214 
0215 //////////////////Layer Histo/////////////////////////////////
0216 void Phase2ITMonitorCluster::bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_id, std::string& subdir) {
0217   std::string folderName = phase2tkutil::getITHistoId(det_id, tTopo_);
0218   if (folderName.empty())
0219     return;
0220 
0221   std::map<std::string, ClusterMEs>::iterator pos = layerMEs_.find(folderName);
0222 
0223   if (pos == layerMEs_.end()) {
0224     ibooker.cd();
0225     ibooker.setCurrentFolder(subdir + "/" + folderName);
0226 
0227     edm::LogInfo("Phase2ITMonitorCluster") << " Booking Histograms in: " << subdir + "/" + folderName;
0228 
0229     ClusterMEs local_mes;
0230 
0231     local_mes.nClusters =
0232         phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("NClustersLayer"), ibooker);
0233 
0234     local_mes.ClusterSize =
0235         phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterSize"), ibooker);
0236 
0237     local_mes.ClusterSizeX =
0238         phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterSizeX"), ibooker);
0239 
0240     local_mes.ClusterSizeY =
0241         phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterSizeY"), ibooker);
0242 
0243     local_mes.ClusterCharge =
0244         phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterCharge"), ibooker);
0245 
0246     local_mes.XYLocalPositionMapPixel =
0247         phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("LocalPositionXY"), ibooker);
0248 
0249     local_mes.XYGlobalPositionMapPixel =
0250         phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_perlayer"), ibooker);
0251 
0252     layerMEs_.emplace(folderName, local_mes);
0253   }
0254 }
0255 
0256 void Phase2ITMonitorCluster::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0257   // clusterITMonitor
0258   edm::ParameterSetDescription desc;
0259   //Global Histos
0260   {
0261     edm::ParameterSetDescription psd0;
0262     psd0.add<std::string>("name", "NumberOfClusters");
0263     psd0.add<std::string>("title", "NumberClusters;Number of Clusters;");
0264     psd0.add<double>("xmin", 0.0);
0265     psd0.add<bool>("switch", true);
0266     psd0.add<double>("xmax", 300000.0);
0267     psd0.add<int>("NxBins", 150);
0268     desc.add<edm::ParameterSetDescription>("GlobalNClusters", psd0);
0269   }
0270   {
0271     edm::ParameterSetDescription psd0;
0272     psd0.add<std::string>("name", "Global_Position_RZ_IT_barrel");
0273     psd0.add<std::string>("title", "Global_Position_RZ_IT_barrel;z [mm];r [mm]");
0274     psd0.add<double>("ymax", 300.0);
0275     psd0.add<int>("NxBins", 1500);
0276     psd0.add<int>("NyBins", 300);
0277     psd0.add<bool>("switch", true);
0278     psd0.add<double>("xmax", 3000.0);
0279     psd0.add<double>("xmin", -3000.0);
0280     psd0.add<double>("ymin", 0.0);
0281     desc.add<edm::ParameterSetDescription>("GlobalPositionRZ_PXB", psd0);
0282   }
0283   {
0284     edm::ParameterSetDescription psd0;
0285     psd0.add<std::string>("name", "Global_Position_XY_IT_barrel");
0286     psd0.add<std::string>("title", "Global_Position_XY_IT_barrel;x [mm];y [mm];");
0287     psd0.add<double>("ymax", 300.0);
0288     psd0.add<int>("NxBins", 600);
0289     psd0.add<int>("NyBins", 600);
0290     psd0.add<bool>("switch", true);
0291     psd0.add<double>("xmax", 300.0);
0292     psd0.add<double>("xmin", -300.0);
0293     psd0.add<double>("ymin", -300.0);
0294     desc.add<edm::ParameterSetDescription>("GlobalPositionXY_PXB", psd0);
0295   }
0296   {
0297     edm::ParameterSetDescription psd0;
0298     psd0.add<std::string>("name", "Global_Position_RZ_IT_endcap");
0299     psd0.add<std::string>("title", "Global_Position_RZ_IT_endcap;z [mm];r [mm]");
0300     psd0.add<double>("ymax", 300.0);
0301     psd0.add<int>("NxBins", 1500);
0302     psd0.add<int>("NyBins", 300);
0303     psd0.add<bool>("switch", true);
0304     psd0.add<double>("xmax", 3000.0);
0305     psd0.add<double>("xmin", -3000.0);
0306     psd0.add<double>("ymin", 0.0);
0307     desc.add<edm::ParameterSetDescription>("GlobalPositionRZ_PXEC", psd0);
0308   }
0309   {
0310     edm::ParameterSetDescription psd0;
0311     psd0.add<std::string>("name", "Global_Position_XY_IT_endcap");
0312     psd0.add<std::string>("title", "Global_Position_XY_IT_endcap; x [mm]; y [mm]");
0313     psd0.add<double>("ymax", 300.0);
0314     psd0.add<int>("NxBins", 600);
0315     psd0.add<int>("NyBins", 600);
0316     psd0.add<bool>("switch", true);
0317     psd0.add<double>("xmax", 300.0);
0318     psd0.add<double>("xmin", -300.0);
0319     psd0.add<double>("ymin", -300.0);
0320     desc.add<edm::ParameterSetDescription>("GlobalPositionXY_PXEC", psd0);
0321   }
0322   //Local histos
0323   //Per layer/ring histos
0324   {
0325     edm::ParameterSetDescription psd0;
0326     psd0.add<std::string>("name", "NumberOfClustersLayer");
0327     psd0.add<std::string>("title", "NumberOfClutsers;Number of Clusters;");
0328     psd0.add<double>("xmin", 0.0);
0329     psd0.add<bool>("switch", true);
0330     psd0.add<double>("xmax", 20000.0);
0331     psd0.add<int>("NxBins", 150);
0332     desc.add<edm::ParameterSetDescription>("NClustersLayer", psd0);
0333   }
0334   {
0335     edm::ParameterSetDescription psd0;
0336     psd0.add<std::string>("name", "ClusterCharge");
0337     psd0.add<std::string>("title", ";Cluster charge;");
0338     psd0.add<double>("xmin", 0.);
0339     psd0.add<bool>("switch", true);
0340     psd0.add<double>("xmax", 100000.);
0341     psd0.add<int>("NxBins", 100);
0342     desc.add<edm::ParameterSetDescription>("ClusterCharge", psd0);
0343   }
0344   {
0345     edm::ParameterSetDescription psd0;
0346     psd0.add<std::string>("name", "ClusterSize");
0347     psd0.add<std::string>("title", ";Cluster size;");
0348     psd0.add<double>("xmin", -0.5);
0349     psd0.add<double>("xmax", 30.5);
0350     psd0.add<int>("NxBins", 31);
0351     psd0.add<bool>("switch", true);
0352     desc.add<edm::ParameterSetDescription>("ClusterSize", psd0);
0353   }
0354   {
0355     edm::ParameterSetDescription psd0;
0356     psd0.add<std::string>("name", "ClusterSizeY");
0357     psd0.add<std::string>("title", ";Cluster sizeY;");
0358     psd0.add<double>("xmin", -0.5);
0359     psd0.add<bool>("switch", true);
0360     psd0.add<double>("xmax", 30.5);
0361     psd0.add<int>("NxBins", 31);
0362     desc.add<edm::ParameterSetDescription>("ClusterSizeY", psd0);
0363   }
0364   {
0365     edm::ParameterSetDescription psd0;
0366     psd0.add<std::string>("name", "ClusterSizeX");
0367     psd0.add<std::string>("title", ";Cluster sizeX;");
0368     psd0.add<double>("xmin", -0.5);
0369     psd0.add<bool>("switch", true);
0370     psd0.add<double>("xmax", 30.5);
0371     psd0.add<int>("NxBins", 31);
0372     desc.add<edm::ParameterSetDescription>("ClusterSizeX", psd0);
0373   }
0374   {
0375     edm::ParameterSetDescription psd0;
0376     psd0.add<std::string>("name", "Local_ClusterPosition_XY");
0377     psd0.add<std::string>("title", "Local_ClusterPosition_XY; x; y");
0378     psd0.add<double>("ymax", 0.0);
0379     psd0.add<int>("NxBins", 500);
0380     psd0.add<int>("NyBins", 500);
0381     psd0.add<bool>("switch", true);
0382     psd0.add<double>("xmax", 0.0);
0383     psd0.add<double>("xmin", 0.0);
0384     psd0.add<double>("ymin", 0.0);
0385     desc.add<edm::ParameterSetDescription>("LocalPositionXY", psd0);
0386   }
0387   {
0388     edm::ParameterSetDescription psd0;
0389     psd0.add<std::string>("name", "GlobalPositionXY_perlayer");
0390     psd0.add<std::string>("title", "GlobalClusterPositionXY_perlayer;x [mm];y [mm];");
0391     psd0.add<double>("ymax", 300.0);
0392     psd0.add<int>("NxBins", 600);
0393     psd0.add<int>("NyBins", 600);
0394     psd0.add<bool>("switch", false);
0395     psd0.add<double>("xmax", 300.0);
0396     psd0.add<double>("xmin", -300.0);
0397     psd0.add<double>("ymin", -300.0);
0398     desc.add<edm::ParameterSetDescription>("GlobalPositionXY_perlayer", psd0);
0399   }
0400 
0401   desc.add<std::string>("TopFolderName", "TrackerPhase2ITCluster");
0402   desc.add<edm::InputTag>("InnerPixelClusterSource", edm::InputTag("siPixelClusters"));
0403   descriptions.add("Phase2ITMonitorCluster", desc);
0404 }
0405 
0406 DEFINE_FWK_MODULE(Phase2ITMonitorCluster);