File indexing completed on 2024-11-06 06:06:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <memory>
0019
0020
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
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
0132
0133 Phase2TrackerMonitorDigi::~Phase2TrackerMonitorDigi() {
0134
0135
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
0145
0146 void Phase2TrackerMonitorDigi::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0147 using namespace edm;
0148
0149
0150 const auto& pixDigiHandle = iEvent.getHandle(itPixelDigiToken_);
0151 const auto& otDigiHandle = iEvent.getHandle(otDigiToken_);
0152
0153
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();
0204 int row = di->row();
0205 int adc = di->adc();
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
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();
0314 int row = di->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
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
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
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
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
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
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
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
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
0660
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
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
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
0798 DEFINE_FWK_MODULE(Phase2TrackerMonitorDigi);