Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-06 06:06:32

0001 // -*- C++ -*-
0002 //
0003 // Package:    Phase2TrackerMonitorDigi
0004 // Class:      Phase2TrackerMonitorDigi
0005 //
0006 /**\class Phase2TrackerMonitorDigi Phase2TrackerMonitorDigi.cc 
0007 
0008  Description: It generates various histograms of digi properties. Manual switching is enabled for each histogram. Seperate Histograms are there for P type and S type sensors of the outer Tracker   
0009 
0010 */
0011 //
0012 // Author: Suchandra Dutta, Gourab Saha, Suvankar Roy Chowdhury, Subir Sarkar
0013 // Date: January 29, 2016
0014 // Date: November 8, 2019 (Modified for adding in phase2 DQM Offline)
0015 //
0016 
0017 // system include files
0018 #include <memory>
0019 
0020 // user includes
0021 #include "DQM/SiTrackerPhase2/interface/TrackerPhase2DQMUtil.h"
0022 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0023 #include "DQMServices/Core/interface/MonitorElement.h"
0024 #include "DataFormats/Common/interface/DetSetVector.h"
0025 #include "DataFormats/Common/interface/Handle.h"
0026 #include "DataFormats/DetId/interface/DetId.h"
0027 #include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h"
0028 #include "DataFormats/SiPixelDigi/interface/PixelDigi.h"
0029 #include "DataFormats/SiPixelDigi/interface/PixelDigiCollection.h"
0030 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0031 #include "FWCore/Framework/interface/ESHandle.h"
0032 #include "FWCore/Framework/interface/ESWatcher.h"
0033 #include "FWCore/Framework/interface/Event.h"
0034 #include "FWCore/Framework/interface/Frameworkfwd.h"
0035 #include "FWCore/Framework/interface/MakerMacros.h"
0036 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0037 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0038 #include "FWCore/ServiceRegistry/interface/Service.h"
0039 #include "FWCore/Utilities/interface/InputTag.h"
0040 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0041 #include "Geometry/CommonDetUnit/interface/PixelGeomDetType.h"
0042 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0043 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0044 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0045 
0046 using Phase2TrackerGeomDetUnit = PixelGeomDetUnit;
0047 
0048 class Phase2TrackerMonitorDigi : public DQMEDAnalyzer {
0049 public:
0050   explicit Phase2TrackerMonitorDigi(const edm::ParameterSet&);
0051   ~Phase2TrackerMonitorDigi() override;
0052   void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
0053   void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0054   void dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) override;
0055   std::string getHistoId(uint32_t det_id, bool flag);
0056 
0057   struct DigiMEs {
0058     MonitorElement* NumberOfDigisPerDet;
0059     MonitorElement* DigiOccupancyP;
0060     MonitorElement* DigiOccupancyS;
0061     MonitorElement* ChargeXYMap;
0062     MonitorElement* PositionOfDigisP;
0063     MonitorElement* PositionOfDigisS;
0064     MonitorElement* ChargeOfDigis;
0065     MonitorElement* ChargeOfDigisVsWidth;
0066     MonitorElement* TotalNumberOfDigisPerLayer;
0067     MonitorElement* NumberOfHitDetectorsPerLayer;
0068     MonitorElement* NumberOfClustersPerDet;
0069     MonitorElement* ClusterWidth;
0070     MonitorElement* ClusterPositionP;
0071     MonitorElement* ClusterPositionS;
0072     MonitorElement* FractionOfOvTBits;
0073     MonitorElement* FractionOfOvTBitsVsEta;
0074     MonitorElement* EtaOccupancyProfP;
0075     MonitorElement* EtaOccupancyProfS;
0076     unsigned int nDigiPerLayer;
0077     unsigned int nHitDetsPerLayer;
0078   };
0079 
0080   struct Ph2DigiCluster {
0081     int charge;
0082     int position;
0083     int width;
0084     int column;
0085   };
0086 
0087   MonitorElement* XYPositionMap;
0088   MonitorElement* RZPositionMap;
0089   MonitorElement* XYOccupancyMap;
0090   MonitorElement* RZOccupancyMap;
0091 
0092 private:
0093   void bookLayerHistos(DQMStore::IBooker& ibooker, unsigned int det_id);
0094   void fillITPixelDigiHistos(const edm::Handle<edm::DetSetVector<PixelDigi>> handle);
0095   void fillOTDigiHistos(const edm::Handle<edm::DetSetVector<Phase2TrackerDigi>> handle);
0096   void fillDigiClusters(DigiMEs& mes, std::vector<Ph2DigiCluster>& digi_clusters);
0097 
0098   const edm::ParameterSet config_;
0099   std::map<std::string, DigiMEs> layerMEs;
0100   const bool pixelFlag_;
0101   const bool clsFlag_;
0102   const std::string geomType_;
0103   const edm::InputTag otDigiSrc_;
0104   const edm::InputTag itPixelDigiSrc_;
0105   const edm::EDGetTokenT<edm::DetSetVector<Phase2TrackerDigi>> otDigiToken_;
0106   const edm::EDGetTokenT<edm::DetSetVector<PixelDigi>> itPixelDigiToken_;
0107   const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0108   const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
0109   const TrackerGeometry* tkGeom_ = nullptr;
0110   const TrackerTopology* tTopo_ = nullptr;
0111 };
0112 
0113 //
0114 // constructors
0115 //
0116 Phase2TrackerMonitorDigi::Phase2TrackerMonitorDigi(const edm::ParameterSet& iConfig)
0117     : config_(iConfig),
0118       pixelFlag_(config_.getParameter<bool>("PixelPlotFillingFlag")),
0119       clsFlag_(config_.getParameter<bool>("StandAloneClusteriserFlag")),
0120       geomType_(config_.getParameter<std::string>("GeometryType")),
0121       otDigiSrc_(config_.getParameter<edm::InputTag>("OuterTrackerDigiSource")),
0122       itPixelDigiSrc_(config_.getParameter<edm::InputTag>("InnerPixelDigiSource")),
0123       otDigiToken_(consumes<edm::DetSetVector<Phase2TrackerDigi>>(otDigiSrc_)),
0124       itPixelDigiToken_(consumes<edm::DetSetVector<PixelDigi>>(itPixelDigiSrc_)),
0125       geomToken_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, edm::Transition::BeginRun>()),
0126       topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()) {
0127   LogDebug("Phase2TrackerMonitorDigi") << ">>> Construct Phase2TrackerMonitorDigi ";
0128 }
0129 
0130 //
0131 // destructor
0132 //
0133 Phase2TrackerMonitorDigi::~Phase2TrackerMonitorDigi() {
0134   // do anything here that needs to be done at desctruction time
0135   // (e.g. close files, deallocate resources etc.)
0136   LogDebug("Phase2TrackerMonitorDigi") << ">>> Destroy Phase2TrackerMonitorDigi ";
0137 }
0138 
0139 void Phase2TrackerMonitorDigi::dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0140   tkGeom_ = &iSetup.getData(geomToken_);
0141   tTopo_ = &iSetup.getData(topoToken_);
0142 }
0143 
0144 // -- Analyze
0145 //
0146 void Phase2TrackerMonitorDigi::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0147   using namespace edm;
0148 
0149   // Get digis
0150   const auto& pixDigiHandle = iEvent.getHandle(itPixelDigiToken_);
0151   const auto& otDigiHandle = iEvent.getHandle(otDigiToken_);
0152 
0153   // Tracker Topology
0154   edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0155   if (theTkDigiGeomWatcher.check(iSetup)) {
0156     if (pixelFlag_)
0157       fillITPixelDigiHistos(pixDigiHandle);
0158     else
0159       fillOTDigiHistos(otDigiHandle);
0160   }
0161 }
0162 void Phase2TrackerMonitorDigi::fillITPixelDigiHistos(const edm::Handle<edm::DetSetVector<PixelDigi>> handle) {
0163   const edm::DetSetVector<PixelDigi>* digis = handle.product();
0164 
0165   for (typename edm::DetSetVector<PixelDigi>::const_iterator DSViter = digis->begin(); DSViter != digis->end();
0166        DSViter++) {
0167     unsigned int rawid = DSViter->id;
0168     LogDebug("Phase2TrackerMonitorDigi") << " Det Id = " << rawid;
0169 
0170     int layer = tTopo_->getITPixelLayerNumber(rawid);
0171 
0172     if (layer < 0)
0173       continue;
0174     const DetId detId(rawid);
0175 
0176     std::string key = getHistoId(rawid, pixelFlag_);
0177     std::map<std::string, DigiMEs>::iterator pos = layerMEs.find(key);
0178 
0179     if (pos == layerMEs.end())
0180       continue;
0181 
0182     if (DetId(detId).det() != DetId::Detector::Tracker)
0183       continue;
0184 
0185     const GeomDetUnit* gDetUnit = tkGeom_->idToDetUnit(detId);
0186     const GeomDet* geomDet = tkGeom_->idToDet(detId);
0187 
0188     const Phase2TrackerGeomDetUnit* tkDetUnit = dynamic_cast<const Phase2TrackerGeomDetUnit*>(gDetUnit);
0189     int nRows = tkDetUnit->specificTopology().nrows();
0190     int nColumns = tkDetUnit->specificTopology().ncolumns();
0191     if (nRows * nColumns == 0)
0192       continue;
0193 
0194     DigiMEs& local_mes = pos->second;
0195 
0196     local_mes.nHitDetsPerLayer++;
0197 
0198     int nDigi = 0;
0199     int row_last = -1;
0200     int col_last = -1;
0201     std::vector<Ph2DigiCluster> digiClusters;
0202     for (typename edm::DetSet<PixelDigi>::const_iterator di = DSViter->begin(); di != DSViter->end(); di++) {
0203       int col = di->column();  // column
0204       int row = di->row();     // row
0205       int adc = di->adc();     // digi charge
0206       if (geomDet) {
0207         MeasurementPoint mp(row + 0.5, col + 0.5);
0208         GlobalPoint pdPos = geomDet->surface().toGlobal(gDetUnit->topology().localPosition(mp));
0209         if (XYPositionMap)
0210           XYPositionMap->Fill(pdPos.x() * 10., pdPos.y() * 10.);
0211         if (RZPositionMap)
0212           RZPositionMap->Fill(pdPos.z() * 10., std::hypot(pdPos.x(), pdPos.y()) * 10.);
0213       }
0214       nDigi++;
0215       LogDebug("Phase2TrackerMonitorDigi") << "  column " << col << " row " << row << std::dec << std::endl;
0216       if (local_mes.ChargeXYMap)
0217         local_mes.ChargeXYMap->Fill(col, row, adc);
0218       if (local_mes.PositionOfDigisP)
0219         local_mes.PositionOfDigisP->Fill(row + 1, col + 1);
0220       if (local_mes.ChargeOfDigis)
0221         local_mes.ChargeOfDigis->Fill(adc);
0222       if (clsFlag_) {
0223         if (row_last == -1 || abs(row - row_last) != 1 || col != col_last) {
0224           Ph2DigiCluster dClus;
0225           dClus.position = row + 1;
0226           dClus.column = col;
0227           dClus.width = 1;
0228           dClus.charge = 255;
0229           digiClusters.push_back(dClus);
0230         } else {
0231           int pos = digiClusters.back().position + row + 1;
0232           int width = digiClusters.back().width + 1;
0233           pos /= width;
0234 
0235           digiClusters.back().position = pos;
0236           digiClusters.back().width += 1;
0237         }
0238         LogDebug("Phase2TrackerMonitorDigi") << " row " << row << " col " << col << " row_last " << row_last
0239                                              << " col_last " << col_last << " width " << digiClusters.back().width;
0240         row_last = row;
0241         col_last = col;
0242       }
0243     }
0244     if (local_mes.NumberOfDigisPerDet)
0245       local_mes.NumberOfDigisPerDet->Fill(nDigi);
0246     if (clsFlag_)
0247       fillDigiClusters(local_mes, digiClusters);
0248     local_mes.nDigiPerLayer += nDigi;
0249     float occupancy = 1.0;
0250     if (nRows * nColumns > 0)
0251       occupancy = nDigi * 1.0 / (nRows * nColumns);
0252     if (geomDet) {
0253       GlobalPoint gp = geomDet->surface().toGlobal(
0254           gDetUnit->topology().localPosition(MeasurementPoint(nRows / 2.0, nColumns / 2.0)));
0255       if (XYOccupancyMap)
0256         XYOccupancyMap->Fill(gp.x() * 10., gp.y() * 10, occupancy);
0257       if (RZOccupancyMap)
0258         RZOccupancyMap->Fill(gp.z() * 10., std::hypot(gp.x(), gp.y()) * 10., occupancy);
0259       if (local_mes.EtaOccupancyProfP)
0260         local_mes.EtaOccupancyProfP->Fill(gp.eta(), occupancy);
0261     }
0262 
0263     if (local_mes.DigiOccupancyP)
0264       local_mes.DigiOccupancyP->Fill(occupancy);
0265   }
0266   // Fill histograms after loop over digis are complete
0267   for (auto& ilayer : layerMEs) {
0268     DigiMEs& local_mes = ilayer.second;
0269     if (local_mes.TotalNumberOfDigisPerLayer)
0270       local_mes.TotalNumberOfDigisPerLayer->Fill(local_mes.nDigiPerLayer);
0271     if (local_mes.NumberOfHitDetectorsPerLayer)
0272       local_mes.NumberOfHitDetectorsPerLayer->Fill(local_mes.nHitDetsPerLayer);
0273     local_mes.nDigiPerLayer = 0;
0274     local_mes.nHitDetsPerLayer = 0;
0275   }
0276 }
0277 void Phase2TrackerMonitorDigi::fillOTDigiHistos(const edm::Handle<edm::DetSetVector<Phase2TrackerDigi>> handle) {
0278   const edm::DetSetVector<Phase2TrackerDigi>* digis = handle.product();
0279 
0280   for (typename edm::DetSetVector<Phase2TrackerDigi>::const_iterator DSViter = digis->begin(); DSViter != digis->end();
0281        DSViter++) {
0282     unsigned int rawid = DSViter->id;
0283     DetId detId(rawid);
0284     LogDebug("Phase2TrackerMonitorDigi") << " Det Id = " << rawid;
0285     int layer = tTopo_->getOTLayerNumber(rawid);
0286     if (layer < 0)
0287       continue;
0288     std::string key = getHistoId(rawid, pixelFlag_);
0289     std::map<std::string, DigiMEs>::iterator pos = layerMEs.find(key);
0290     if (pos == layerMEs.end())
0291       continue;
0292     DigiMEs& local_mes = pos->second;
0293 
0294     local_mes.nHitDetsPerLayer++;
0295     if (DetId(detId).det() != DetId::Detector::Tracker)
0296       continue;
0297 
0298     const GeomDetUnit* gDetUnit = tkGeom_->idToDetUnit(detId);
0299     const GeomDet* geomDet = tkGeom_->idToDet(detId);
0300 
0301     const Phase2TrackerGeomDetUnit* tkDetUnit = dynamic_cast<const Phase2TrackerGeomDetUnit*>(gDetUnit);
0302     int nRows = tkDetUnit->specificTopology().nrows();
0303     int nColumns = tkDetUnit->specificTopology().ncolumns();
0304     if (nRows * nColumns == 0)
0305       continue;
0306 
0307     int nDigi = 0;
0308     int row_last = -1;
0309     int col_last = -1;
0310     float frac_ot = 0.;
0311     std::vector<Ph2DigiCluster> digiClusters;
0312     for (typename edm::DetSet<Phase2TrackerDigi>::const_iterator di = DSViter->begin(); di != DSViter->end(); di++) {
0313       int col = di->column();  // column
0314       int row = di->row();     // row
0315       const DetId detId(rawid);
0316 
0317       if (geomDet) {
0318         MeasurementPoint mp(row + 0.5, col + 0.5);
0319         GlobalPoint pdPos = geomDet->surface().toGlobal(gDetUnit->topology().localPosition(mp));
0320         if (XYPositionMap)
0321           XYPositionMap->Fill(pdPos.x() * 10., pdPos.y() * 10.);
0322         if (RZPositionMap)
0323           RZPositionMap->Fill(pdPos.z() * 10., std::hypot(pdPos.x(), pdPos.y()) * 10.);
0324       }
0325       nDigi++;
0326       if (di->overThreshold())
0327         frac_ot++;
0328       LogDebug("Phase2TrackerMonitorDigi") << "  column " << col << " row " << row << std::dec << std::endl;
0329       if (nColumns > 2 && local_mes.PositionOfDigisP)
0330         local_mes.PositionOfDigisP->Fill(row + 1, col + 1);
0331       if (nColumns <= 2 && local_mes.PositionOfDigisS)
0332         local_mes.PositionOfDigisS->Fill(row + 1, col + 1);
0333 
0334       if (clsFlag_) {
0335         if (row_last == -1 || abs(row - row_last) != 1 || col != col_last) {
0336           Ph2DigiCluster dClus;
0337           dClus.position = row + 1;
0338           dClus.column = col;
0339           dClus.width = 1;
0340           dClus.charge = 255;
0341           digiClusters.push_back(dClus);
0342         } else {
0343           int pos = digiClusters.back().position + row + 1;
0344           int width = digiClusters.back().width + 1;
0345           pos /= width;
0346 
0347           digiClusters.back().position = pos;
0348           digiClusters.back().width += 1;
0349         }
0350         row_last = row;
0351         col_last = col;
0352         LogDebug("Phase2TrackerMonitorDigi") << " row " << row << " col " << col << " row_last " << row_last
0353                                              << " col_last " << col_last << " width " << digiClusters.back().width;
0354       }
0355     }
0356     if (local_mes.NumberOfDigisPerDet)
0357       local_mes.NumberOfDigisPerDet->Fill(nDigi);
0358     if (clsFlag_)
0359       fillDigiClusters(local_mes, digiClusters);
0360     local_mes.nDigiPerLayer += nDigi;
0361     if (nDigi)
0362       frac_ot /= nDigi;
0363     if (local_mes.FractionOfOvTBits && nColumns <= 2)
0364       local_mes.FractionOfOvTBits->Fill(frac_ot);
0365 
0366     float occupancy = 1.0;
0367     if (nRows * nColumns > 0)
0368       occupancy = nDigi * 1.0 / (nRows * nColumns);
0369     if (geomDet) {
0370       GlobalPoint gp = geomDet->surface().toGlobal(gDetUnit->topology().localPosition(MeasurementPoint(0.0, 0.0)));
0371       if (XYOccupancyMap)
0372         XYOccupancyMap->Fill(gp.x() * 10., gp.y() * 10., occupancy);
0373       if (RZOccupancyMap)
0374         RZOccupancyMap->Fill(gp.z() * 10., std::hypot(gp.x(), gp.y()) * 10., occupancy);
0375       if (nColumns > 2) {
0376         if (local_mes.DigiOccupancyP)
0377           local_mes.DigiOccupancyP->Fill(occupancy);
0378         if (local_mes.EtaOccupancyProfP)
0379           local_mes.EtaOccupancyProfP->Fill(gp.eta(), occupancy);
0380       } else {
0381         if (local_mes.DigiOccupancyS)
0382           local_mes.DigiOccupancyS->Fill(occupancy);
0383         if (local_mes.EtaOccupancyProfS)
0384           local_mes.EtaOccupancyProfS->Fill(gp.eta(), occupancy);
0385         if (local_mes.FractionOfOvTBitsVsEta)
0386           local_mes.FractionOfOvTBitsVsEta->Fill(gp.eta(), frac_ot);
0387       }
0388     }
0389   }
0390   // Fill histograms after loop over digis are complete
0391   for (auto& ilayer : layerMEs) {
0392     DigiMEs& local_mes = ilayer.second;
0393     if (local_mes.TotalNumberOfDigisPerLayer)
0394       local_mes.TotalNumberOfDigisPerLayer->Fill(local_mes.nDigiPerLayer);
0395     if (local_mes.NumberOfHitDetectorsPerLayer)
0396       local_mes.NumberOfHitDetectorsPerLayer->Fill(local_mes.nHitDetsPerLayer);
0397     local_mes.nDigiPerLayer = 0;
0398     local_mes.nHitDetsPerLayer = 0;
0399   }
0400 }
0401 //
0402 // -- Book Histograms
0403 //
0404 void Phase2TrackerMonitorDigi::bookHistograms(DQMStore::IBooker& ibooker,
0405                                               edm::Run const& iRun,
0406                                               edm::EventSetup const& iSetup) {
0407   std::string top_folder = config_.getParameter<std::string>("TopFolderName");
0408   edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0409 
0410   if (theTkDigiGeomWatcher.check(iSetup)) {
0411     for (auto const& det_u : tkGeom_->detUnits()) {
0412       unsigned int detId_raw = det_u->geographicalId().rawId();
0413       bookLayerHistos(ibooker, detId_raw);
0414     }
0415   }
0416   ibooker.cd();
0417   std::stringstream folder_name;
0418   folder_name << top_folder << "/"
0419               << "DigiMonitor";
0420   ibooker.setCurrentFolder(folder_name.str());
0421 
0422   edm::ParameterSet Parameters = config_.getParameter<edm::ParameterSet>("XYPositionMapH");
0423   edm::ParameterSet ParametersOcc = config_.getParameter<edm::ParameterSet>("DigiOccupancyPH");
0424   if (Parameters.getParameter<bool>("switch"))
0425     XYPositionMap = ibooker.book2D("DigiXPosVsYPos",
0426                                    "DigiXPosVsYPos",
0427                                    Parameters.getParameter<int32_t>("Nxbins"),
0428                                    Parameters.getParameter<double>("xmin"),
0429                                    Parameters.getParameter<double>("xmax"),
0430                                    Parameters.getParameter<int32_t>("Nybins"),
0431                                    Parameters.getParameter<double>("ymin"),
0432                                    Parameters.getParameter<double>("ymax"));
0433   else
0434     XYPositionMap = nullptr;
0435 
0436   if (Parameters.getParameter<bool>("switch") && ParametersOcc.getParameter<bool>("switch"))
0437     XYOccupancyMap = ibooker.bookProfile2D("OccupancyInXY",
0438                                            "OccupancyInXY",
0439                                            Parameters.getParameter<int32_t>("Nxbins"),
0440                                            Parameters.getParameter<double>("xmin"),
0441                                            Parameters.getParameter<double>("xmax"),
0442                                            Parameters.getParameter<int32_t>("Nybins"),
0443                                            Parameters.getParameter<double>("ymin"),
0444                                            Parameters.getParameter<double>("ymax"),
0445                                            ParametersOcc.getParameter<double>("xmin"),
0446                                            ParametersOcc.getParameter<double>("xmax"));
0447   else
0448     XYOccupancyMap = nullptr;
0449 
0450   Parameters = config_.getParameter<edm::ParameterSet>("RZPositionMapH");
0451   if (Parameters.getParameter<bool>("switch"))
0452     RZPositionMap = ibooker.book2D("DigiRPosVsZPos",
0453                                    "DigiRPosVsZPos",
0454                                    Parameters.getParameter<int32_t>("Nxbins"),
0455                                    Parameters.getParameter<double>("xmin"),
0456                                    Parameters.getParameter<double>("xmax"),
0457                                    Parameters.getParameter<int32_t>("Nybins"),
0458                                    Parameters.getParameter<double>("ymin"),
0459                                    Parameters.getParameter<double>("ymax"));
0460   else
0461     RZPositionMap = nullptr;
0462 
0463   if (Parameters.getParameter<bool>("switch") && ParametersOcc.getParameter<bool>("switch"))
0464     RZOccupancyMap = ibooker.bookProfile2D("OccupancyInRZ",
0465                                            "OccupancyInRZ",
0466                                            Parameters.getParameter<int32_t>("Nxbins"),
0467                                            Parameters.getParameter<double>("xmin"),
0468                                            Parameters.getParameter<double>("xmax"),
0469                                            Parameters.getParameter<int32_t>("Nybins"),
0470                                            Parameters.getParameter<double>("ymin"),
0471                                            Parameters.getParameter<double>("ymax"),
0472                                            ParametersOcc.getParameter<double>("xmin"),
0473                                            ParametersOcc.getParameter<double>("xmax"));
0474   else
0475     RZOccupancyMap = nullptr;
0476 }
0477 //
0478 // -- Book Layer Histograms
0479 //
0480 void Phase2TrackerMonitorDigi::bookLayerHistos(DQMStore::IBooker& ibooker, unsigned int det_id) {
0481   int layer;
0482   if (pixelFlag_)
0483     layer = tTopo_->getITPixelLayerNumber(det_id);
0484   else
0485     layer = tTopo_->getOTLayerNumber(det_id);
0486 
0487   if (layer < 0)
0488     return;
0489   std::string key = getHistoId(det_id, pixelFlag_);
0490   std::map<std::string, DigiMEs>::iterator pos = layerMEs.find(key);
0491 
0492   if (pos == layerMEs.end()) {
0493     std::string top_folder = config_.getParameter<std::string>("TopFolderName");
0494     std::stringstream folder_name;
0495 
0496     //For endCap: P-type sensors are present only upto ring 10 for discs 1&2 (TEDD-1) and upto ring 7 for discs 3,4&5 (TEDD-2)
0497     bool isPStypeModForTEDD_1 =
0498         (!pixelFlag_ && layer > 100 && tTopo_->tidWheel(det_id) < 3 && tTopo_->tidRing(det_id) <= 10) ? true : false;
0499     bool isPStypeModForTEDD_2 =
0500         (!pixelFlag_ && layer > 100 && tTopo_->tidWheel(det_id) >= 3 && tTopo_->tidRing(det_id) <= 7) ? true : false;
0501 
0502     bool isPtypeSensor =
0503         (pixelFlag_ || (layer < 4 || (layer > 6 && (isPStypeModForTEDD_1 || isPStypeModForTEDD_2)))) ? true : false;
0504 
0505     ibooker.cd();
0506     ibooker.setCurrentFolder(top_folder + "/DigiMonitor/" + key);
0507     LogDebug("Phase2TrackerMonitorDigi") << " Booking Histograms in : " << key;
0508 
0509     std::ostringstream HistoName;
0510     DigiMEs local_mes;
0511 
0512     local_mes.nDigiPerLayer = 0;
0513     local_mes.nHitDetsPerLayer = 0;
0514 
0515     edm::ParameterSet Parameters = config_.getParameter<edm::ParameterSet>("NumberOfDigisPerDetH");
0516     edm::ParameterSet EtaParameters = config_.getParameter<edm::ParameterSet>("EtaH");
0517     HistoName.str("");
0518     HistoName << "NumberOfDigisPerDet";
0519     if (Parameters.getParameter<bool>("switch"))
0520       local_mes.NumberOfDigisPerDet = ibooker.book1D(HistoName.str(),
0521                                                      HistoName.str(),
0522                                                      Parameters.getParameter<int32_t>("Nbins"),
0523                                                      Parameters.getParameter<double>("xmin"),
0524                                                      Parameters.getParameter<double>("xmax"));
0525     else
0526       local_mes.NumberOfDigisPerDet = nullptr;
0527 
0528     Parameters = config_.getParameter<edm::ParameterSet>("TotalNumberOfDigisPerLayerH");
0529     HistoName.str("");
0530     HistoName << "TotalNumberOfDigisPerLayer";
0531     if (Parameters.getParameter<bool>("switch"))
0532       local_mes.TotalNumberOfDigisPerLayer = ibooker.book1D(HistoName.str(),
0533                                                             HistoName.str(),
0534                                                             Parameters.getParameter<int32_t>("Nbins"),
0535                                                             Parameters.getParameter<double>("xmin"),
0536                                                             Parameters.getParameter<double>("xmax"));
0537     else
0538       local_mes.TotalNumberOfDigisPerLayer = nullptr;
0539 
0540     Parameters = config_.getParameter<edm::ParameterSet>("NumberOfHitDetsPerLayerH");
0541     HistoName.str("");
0542     HistoName << "NumberOfHitDetectorsPerLayer";
0543     if (Parameters.getParameter<bool>("switch"))
0544       local_mes.NumberOfHitDetectorsPerLayer = ibooker.book1D(HistoName.str(),
0545                                                               HistoName.str(),
0546                                                               Parameters.getParameter<int32_t>("Nbins"),
0547                                                               Parameters.getParameter<double>("xmin"),
0548                                                               Parameters.getParameter<double>("xmax"));
0549     else
0550       local_mes.NumberOfHitDetectorsPerLayer = nullptr;
0551 
0552     // Plots only for the inner pixel
0553     if (pixelFlag_) {
0554       Parameters = config_.getParameter<edm::ParameterSet>("ChargeXYMapH");
0555       HistoName.str("");
0556       HistoName << "ChargeXYMap";
0557       if (Parameters.getParameter<bool>("switch"))
0558         local_mes.ChargeXYMap = ibooker.book2D(HistoName.str(),
0559                                                HistoName.str(),
0560                                                Parameters.getParameter<int32_t>("Nxbins"),
0561                                                Parameters.getParameter<double>("xmin"),
0562                                                Parameters.getParameter<double>("xmax"),
0563                                                Parameters.getParameter<int32_t>("Nybins"),
0564                                                Parameters.getParameter<double>("ymin"),
0565                                                Parameters.getParameter<double>("ymax"));
0566       else
0567         local_mes.ChargeXYMap = nullptr;
0568 
0569       Parameters = config_.getParameter<edm::ParameterSet>("DigiChargeH");
0570       HistoName.str("");
0571       HistoName << "ChargeOfDigis";
0572       if (Parameters.getParameter<bool>("switch"))
0573         local_mes.ChargeOfDigis = ibooker.book1D(HistoName.str(),
0574                                                  HistoName.str(),
0575                                                  Parameters.getParameter<int32_t>("Nbins"),
0576                                                  Parameters.getParameter<double>("xmin"),
0577                                                  Parameters.getParameter<double>("xmax"));
0578       else
0579         local_mes.ChargeOfDigis = nullptr;
0580 
0581       // For standalone clusteriser
0582       if (clsFlag_) {
0583         edm::ParameterSet WidthParameters = config_.getParameter<edm::ParameterSet>("ClusterWidthH");
0584         HistoName.str("");
0585         HistoName << "ChargeOfDigisVsWidth";
0586         if (Parameters.getParameter<bool>("switch") && WidthParameters.getParameter<bool>("switch"))
0587           local_mes.ChargeOfDigisVsWidth = ibooker.book2D(HistoName.str(),
0588                                                           HistoName.str(),
0589                                                           Parameters.getParameter<int32_t>("Nbins"),
0590                                                           Parameters.getParameter<double>("xmin"),
0591                                                           Parameters.getParameter<double>("xmax"),
0592                                                           WidthParameters.getParameter<int32_t>("Nbins"),
0593                                                           WidthParameters.getParameter<double>("xmin"),
0594                                                           WidthParameters.getParameter<double>("xmax"));
0595         else
0596           local_mes.ChargeOfDigisVsWidth = nullptr;
0597       }
0598     }
0599     // For outer tracker modules (S-type histograms)
0600     else {
0601       Parameters = config_.getParameter<edm::ParameterSet>("DigiOccupancySH");
0602       HistoName.str("");
0603       HistoName << "DigiOccupancyS";
0604       if (Parameters.getParameter<bool>("switch"))
0605         local_mes.DigiOccupancyS = ibooker.book1D(HistoName.str(),
0606                                                   HistoName.str(),
0607                                                   Parameters.getParameter<int32_t>("Nbins"),
0608                                                   Parameters.getParameter<double>("xmin"),
0609                                                   Parameters.getParameter<double>("xmax"));
0610       else
0611         local_mes.DigiOccupancyS = nullptr;
0612 
0613       HistoName.str("");
0614       HistoName << "DigiOccupancyVsEtaS";
0615       if (Parameters.getParameter<bool>("switch") && EtaParameters.getParameter<bool>("switch"))
0616         local_mes.EtaOccupancyProfS = ibooker.bookProfile(HistoName.str(),
0617                                                           HistoName.str(),
0618                                                           EtaParameters.getParameter<int32_t>("Nbins"),
0619                                                           EtaParameters.getParameter<double>("xmin"),
0620                                                           EtaParameters.getParameter<double>("xmax"),
0621                                                           Parameters.getParameter<double>("xmin"),
0622                                                           Parameters.getParameter<double>("xmax"),
0623                                                           "");
0624       else
0625         local_mes.EtaOccupancyProfS = nullptr;
0626 
0627       Parameters = config_.getParameter<edm::ParameterSet>("PositionOfDigisSH");
0628       HistoName.str("");
0629       HistoName << "PositionOfDigisS";
0630       if (Parameters.getParameter<bool>("switch"))
0631         local_mes.PositionOfDigisS = ibooker.book2D(HistoName.str(),
0632                                                     HistoName.str(),
0633                                                     Parameters.getParameter<int32_t>("Nxbins"),
0634                                                     Parameters.getParameter<double>("xmin"),
0635                                                     Parameters.getParameter<double>("xmax"),
0636                                                     Parameters.getParameter<int32_t>("Nybins"),
0637                                                     Parameters.getParameter<double>("ymin"),
0638                                                     Parameters.getParameter<double>("ymax"));
0639       else
0640         local_mes.PositionOfDigisS = nullptr;
0641 
0642       // For standalone clusteriser
0643       if (clsFlag_) {
0644         Parameters = config_.getParameter<edm::ParameterSet>("ClusterPositionSH");
0645         HistoName.str("");
0646         HistoName << "ClusterPositionS";
0647         if (Parameters.getParameter<bool>("switch"))
0648           local_mes.ClusterPositionS = ibooker.book2D(HistoName.str(),
0649                                                       HistoName.str(),
0650                                                       Parameters.getParameter<int32_t>("Nxbins"),
0651                                                       Parameters.getParameter<double>("xmin"),
0652                                                       Parameters.getParameter<double>("xmax"),
0653                                                       Parameters.getParameter<int32_t>("Nybins"),
0654                                                       Parameters.getParameter<double>("ymin"),
0655                                                       Parameters.getParameter<double>("ymax"));
0656         else
0657           local_mes.ClusterPositionS = nullptr;
0658       }
0659       // Only for the S-type sensor of PS module
0660       // FracOfOverThresholdBits is only available for S-type sensor of PS module
0661       if (isPStypeModForTEDD_1 || isPStypeModForTEDD_2) {
0662         HistoName.str("");
0663         HistoName << "FractionOfOverThresholdDigis";
0664         local_mes.FractionOfOvTBits = ibooker.book1D(HistoName.str(), HistoName.str(), 11, -0.05, 1.05);
0665 
0666         Parameters = config_.getParameter<edm::ParameterSet>("NumberOfDigisPerDetH");
0667         HistoName.str("");
0668         HistoName << "FractionOfOverThresholdDigisVaEta";
0669         if (Parameters.getParameter<bool>("switch") && EtaParameters.getParameter<bool>("switch"))
0670           local_mes.FractionOfOvTBitsVsEta = ibooker.bookProfile(HistoName.str(),
0671                                                                  HistoName.str(),
0672                                                                  EtaParameters.getParameter<int32_t>("Nbins"),
0673                                                                  EtaParameters.getParameter<double>("xmin"),
0674                                                                  EtaParameters.getParameter<double>("xmax"),
0675                                                                  Parameters.getParameter<double>("xmin"),
0676                                                                  Parameters.getParameter<double>("xmax"),
0677                                                                  "");
0678         else
0679           local_mes.FractionOfOvTBitsVsEta = nullptr;
0680       }
0681     }
0682 
0683     // Plots for P-type sensor (Pixel or P-side of PS module)
0684     if (isPtypeSensor) {
0685       Parameters = config_.getParameter<edm::ParameterSet>("DigiOccupancyPH");
0686       HistoName.str("");
0687       HistoName << "DigiOccupancyP";
0688       if (Parameters.getParameter<bool>("switch"))
0689         local_mes.DigiOccupancyP = ibooker.book1D(HistoName.str(),
0690                                                   HistoName.str(),
0691                                                   Parameters.getParameter<int32_t>("Nbins"),
0692                                                   Parameters.getParameter<double>("xmin"),
0693                                                   Parameters.getParameter<double>("xmax"));
0694       else
0695         local_mes.DigiOccupancyP = nullptr;
0696 
0697       HistoName.str("");
0698       HistoName << "DigiOccupancyVsEtaP";
0699       if (Parameters.getParameter<bool>("switch") && EtaParameters.getParameter<bool>("switch"))
0700         local_mes.EtaOccupancyProfP = ibooker.bookProfile(HistoName.str(),
0701                                                           HistoName.str(),
0702                                                           EtaParameters.getParameter<int32_t>("Nbins"),
0703                                                           EtaParameters.getParameter<double>("xmin"),
0704                                                           EtaParameters.getParameter<double>("xmax"),
0705                                                           Parameters.getParameter<double>("xmin"),
0706                                                           Parameters.getParameter<double>("xmax"),
0707                                                           "");
0708       else
0709         local_mes.EtaOccupancyProfP = nullptr;
0710 
0711       Parameters = config_.getParameter<edm::ParameterSet>("PositionOfDigisPH");
0712       HistoName.str("");
0713       HistoName << "PositionOfDigisP";
0714       if (Parameters.getParameter<bool>("switch"))
0715         local_mes.PositionOfDigisP = ibooker.book2D(HistoName.str(),
0716                                                     HistoName.str(),
0717                                                     Parameters.getParameter<int32_t>("Nxbins"),
0718                                                     Parameters.getParameter<double>("xmin"),
0719                                                     Parameters.getParameter<double>("xmax"),
0720                                                     Parameters.getParameter<int32_t>("Nybins"),
0721                                                     Parameters.getParameter<double>("ymin"),
0722                                                     Parameters.getParameter<double>("ymax"));
0723       else
0724         local_mes.PositionOfDigisP = nullptr;
0725 
0726       if (clsFlag_) {
0727         Parameters = config_.getParameter<edm::ParameterSet>("ClusterPositionPH");
0728         HistoName.str("");
0729         HistoName << "ClusterPositionP";
0730         if (Parameters.getParameter<bool>("switch"))
0731           local_mes.ClusterPositionP = ibooker.book2D(HistoName.str(),
0732                                                       HistoName.str(),
0733                                                       Parameters.getParameter<int32_t>("Nxbins"),
0734                                                       Parameters.getParameter<double>("xmin"),
0735                                                       Parameters.getParameter<double>("xmax"),
0736                                                       Parameters.getParameter<int32_t>("Nybins"),
0737                                                       Parameters.getParameter<double>("ymin"),
0738                                                       Parameters.getParameter<double>("ymax"));
0739         else
0740           local_mes.ClusterPositionP = nullptr;
0741       }
0742     }
0743 
0744     // Plots for Standalone clusters (Can be switched on from configs)
0745     if (clsFlag_) {
0746       Parameters = config_.getParameter<edm::ParameterSet>("NumberOfClustersPerDetH");
0747       HistoName.str("");
0748       HistoName << "NumberOfClustersPerDet";
0749       if (Parameters.getParameter<bool>("switch"))
0750         local_mes.NumberOfClustersPerDet = ibooker.book1D(HistoName.str(),
0751                                                           HistoName.str(),
0752                                                           Parameters.getParameter<int32_t>("Nbins"),
0753                                                           Parameters.getParameter<double>("xmin"),
0754                                                           Parameters.getParameter<double>("xmax"));
0755       else
0756         local_mes.NumberOfClustersPerDet = nullptr;
0757 
0758       Parameters = config_.getParameter<edm::ParameterSet>("ClusterWidthH");
0759       HistoName.str("");
0760       HistoName << "ClusterWidth";
0761       if (Parameters.getParameter<bool>("switch"))
0762         local_mes.ClusterWidth = ibooker.book1D(HistoName.str(),
0763                                                 HistoName.str(),
0764                                                 Parameters.getParameter<int32_t>("Nbins"),
0765                                                 Parameters.getParameter<double>("xmin"),
0766                                                 Parameters.getParameter<double>("xmax"));
0767       else
0768         local_mes.ClusterWidth = nullptr;
0769     }
0770 
0771     layerMEs.insert(std::make_pair(key, local_mes));
0772   }
0773 }
0774 
0775 std::string Phase2TrackerMonitorDigi::getHistoId(uint32_t det_id, bool flag) {
0776   if (flag)
0777     return phase2tkutil::getITHistoId(det_id, tTopo_);
0778   else
0779     return phase2tkutil::getOTHistoId(det_id, tTopo_);
0780 }
0781 
0782 void Phase2TrackerMonitorDigi::fillDigiClusters(DigiMEs& mes, std::vector<Ph2DigiCluster>& digi_clusters) {
0783   int nclus = digi_clusters.size();
0784   if (mes.NumberOfClustersPerDet)
0785     mes.NumberOfClustersPerDet->Fill(nclus);
0786   for (auto& iclus : digi_clusters) {
0787     if (mes.ClusterWidth)
0788       mes.ClusterWidth->Fill(iclus.width);
0789     if (pixelFlag_ && mes.ChargeOfDigisVsWidth)
0790       mes.ChargeOfDigisVsWidth->Fill(iclus.charge, iclus.width);
0791     if (mes.ClusterPositionP)
0792       mes.ClusterPositionP->Fill(iclus.position, iclus.column + 1);
0793     if (!pixelFlag_ && mes.ClusterPositionS && iclus.column <= 2)
0794       mes.ClusterPositionS->Fill(iclus.position, iclus.column + 1);
0795   }
0796 }
0797 //define this as a plug-in
0798 DEFINE_FWK_MODULE(Phase2TrackerMonitorDigi);