File indexing completed on 2024-04-06 12:08:57
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
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
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
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
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
0101
0102 void Phase2ITMonitorCluster::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0103
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
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
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
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)
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);
0168 }
0169
0170
0171
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
0200 edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0201 if (theTkDigiGeomWatcher.check(iSetup)) {
0202 for (auto const& det_u : tkGeom_->detUnits()) {
0203
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
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
0258 edm::ParameterSetDescription desc;
0259
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
0323
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);