File indexing completed on 2024-04-06 12:08:57
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <memory>
0016 #include "FWCore/Framework/interface/MakerMacros.h"
0017 #include "FWCore/Framework/interface/ESWatcher.h"
0018 #include "FWCore/Framework/interface/Frameworkfwd.h"
0019 #include "FWCore/Framework/interface/Event.h"
0020 #include "FWCore/Framework/interface/ESHandle.h"
0021 #include "FWCore/ServiceRegistry/interface/Service.h"
0022 #include "FWCore/Utilities/interface/InputTag.h"
0023 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0024 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0025 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0026 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0027 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0028 #include "DataFormats/Common/interface/DetSetVectorNew.h"
0029 #include "DataFormats/Common/interface/DetSetVector.h"
0030 #include "DataFormats/Common/interface/Handle.h"
0031 #include "DataFormats/DetId/interface/DetId.h"
0032 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0033 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0034 #include "DataFormats/Phase2TrackerCluster/interface/Phase2TrackerCluster1D.h"
0035 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0036
0037 #include "DQMServices/Core/interface/MonitorElement.h"
0038 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0039 #include "DQMServices/Core/interface/DQMStore.h"
0040
0041 class Phase2OTMonitorCluster : public DQMEDAnalyzer {
0042 public:
0043 explicit Phase2OTMonitorCluster(const edm::ParameterSet&);
0044 ~Phase2OTMonitorCluster() override;
0045 void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
0046 void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0047 void dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) override;
0048 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0049
0050 private:
0051 struct ClusterMEs {
0052 MonitorElement* nClusters_P = nullptr;
0053 MonitorElement* ClusterSize_P = nullptr;
0054 MonitorElement* XYGlobalPositionMap_P = nullptr;
0055 MonitorElement* XYLocalPositionMap_P = nullptr;
0056
0057 MonitorElement* nClusters_S = nullptr;
0058 MonitorElement* ClusterSize_S = nullptr;
0059 MonitorElement* XYGlobalPositionMap_S = nullptr;
0060 MonitorElement* XYLocalPositionMap_S = nullptr;
0061 };
0062 MonitorElement* numberClusters_;
0063 MonitorElement* globalXY_P_;
0064 MonitorElement* globalRZ_P_;
0065 MonitorElement* globalXY_S_;
0066 MonitorElement* globalRZ_S_;
0067
0068 void fillOTHistos(const edm::Event& iEvent);
0069
0070 void bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_it, std::string& subdir);
0071
0072 std::map<std::string, ClusterMEs> layerMEs_;
0073
0074 edm::ParameterSet config_;
0075 edm::EDGetTokenT<Phase2TrackerCluster1DCollectionNew> clustersToken_;
0076 const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0077 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
0078 const TrackerGeometry* tkGeom_ = nullptr;
0079 const TrackerTopology* tTopo_ = nullptr;
0080 };
0081 #include "DQM/SiTrackerPhase2/interface/TrackerPhase2DQMUtil.h"
0082
0083
0084
0085 Phase2OTMonitorCluster::Phase2OTMonitorCluster(const edm::ParameterSet& iConfig)
0086 : config_(iConfig),
0087 clustersToken_(consumes<Phase2TrackerCluster1DCollectionNew>(config_.getParameter<edm::InputTag>("clusterSrc"))),
0088 geomToken_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord, edm::Transition::BeginRun>()),
0089 topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd, edm::Transition::BeginRun>()) {
0090 edm::LogInfo("Phase2OTMonitorCluster") << ">>> Construct Phase2OTMonitorCluster ";
0091 }
0092
0093 Phase2OTMonitorCluster::~Phase2OTMonitorCluster() {
0094 edm::LogInfo("Phase2OTMonitorCluster") << ">>> Destroy Phase2OTMonitorCluster ";
0095 }
0096
0097
0098 void Phase2OTMonitorCluster::dqmBeginRun(const edm::Run& iRun, const edm::EventSetup& iSetup) {
0099 tkGeom_ = &iSetup.getData(geomToken_);
0100 tTopo_ = &iSetup.getData(topoToken_);
0101 }
0102
0103
0104
0105 void Phase2OTMonitorCluster::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0106
0107 const auto& clusterHandle = iEvent.getHandle(clustersToken_);
0108
0109 if (!clusterHandle.isValid()) {
0110 edm::LogWarning("Phase2OTMonitorCluster") << "No Phase2TrackerCluster1D Collection found in the event. Skipping!";
0111 return;
0112 }
0113
0114
0115 std::map<std::string, unsigned int> nClustersCounter_P;
0116 std::map<std::string, unsigned int> nClustersCounter_S;
0117 unsigned int nclus = 0;
0118 for (const auto& DSVItr : *clusterHandle) {
0119
0120 uint32_t rawid(DSVItr.detId());
0121 DetId detId(rawid);
0122 const GeomDetUnit* geomDetUnit(tkGeom_->idToDetUnit(detId));
0123 if (!geomDetUnit)
0124 continue;
0125
0126 std::string folderkey = phase2tkutil::getOTHistoId(detId, tTopo_);
0127
0128 TrackerGeometry::ModuleType mType = tkGeom_->getDetectorType(detId);
0129
0130
0131 if (mType == TrackerGeometry::ModuleType::Ph2PSP) {
0132 auto counterDet = nClustersCounter_P.find(folderkey);
0133 if (counterDet == nClustersCounter_P.end())
0134 nClustersCounter_P.emplace(folderkey, DSVItr.size());
0135 else
0136 counterDet->second += DSVItr.size();
0137 } else if (mType == TrackerGeometry::ModuleType::Ph2PSS || mType == TrackerGeometry::ModuleType::Ph2SS) {
0138 auto counterDet = nClustersCounter_S.find(folderkey);
0139 if (counterDet == nClustersCounter_S.end())
0140 nClustersCounter_S.emplace(folderkey, DSVItr.size());
0141 else
0142 counterDet->second += DSVItr.size();
0143 }
0144 nclus += DSVItr.size();
0145
0146 for (const auto& clusterItr : DSVItr) {
0147 MeasurementPoint mpCluster(clusterItr.center(), clusterItr.column() + 0.5);
0148 Local3DPoint localPosCluster = geomDetUnit->topology().localPosition(mpCluster);
0149 Global3DPoint globalPosCluster = geomDetUnit->surface().toGlobal(localPosCluster);
0150 double gx = globalPosCluster.x() * 10.;
0151 double gy = globalPosCluster.y() * 10.;
0152 double gz = globalPosCluster.z() * 10.;
0153 double gr = globalPosCluster.perp() * 10.;
0154 auto layerMEit = layerMEs_.find(folderkey);
0155 if (layerMEit == layerMEs_.end())
0156 continue;
0157 ClusterMEs& local_mes = layerMEit->second;
0158 if (mType == TrackerGeometry::ModuleType::Ph2PSP) {
0159 globalXY_P_->Fill(gx, gy);
0160 globalRZ_P_->Fill(gz, gr);
0161 local_mes.ClusterSize_P->Fill(clusterItr.size());
0162 local_mes.XYLocalPositionMap_P->Fill(localPosCluster.x(), localPosCluster.y());
0163
0164 if (local_mes.XYGlobalPositionMap_P != nullptr)
0165 local_mes.XYGlobalPositionMap_P->Fill(gx, gy);
0166 } else if (mType == TrackerGeometry::ModuleType::Ph2PSS || mType == TrackerGeometry::ModuleType::Ph2SS) {
0167 globalXY_S_->Fill(gx, gy);
0168 globalRZ_S_->Fill(gz, gr);
0169 local_mes.ClusterSize_S->Fill(clusterItr.size());
0170 local_mes.XYLocalPositionMap_S->Fill(localPosCluster.x(), localPosCluster.y());
0171
0172 if (local_mes.XYGlobalPositionMap_S != nullptr)
0173 local_mes.XYGlobalPositionMap_S->Fill(gx, gy);
0174 }
0175 }
0176 }
0177 for (const auto& it : nClustersCounter_P) {
0178 if (layerMEs_.find(it.first) == layerMEs_.end())
0179 continue;
0180 if (layerMEs_[it.first].nClusters_P != nullptr)
0181 layerMEs_[it.first].nClusters_P->Fill(it.second);
0182 }
0183 for (const auto& it : nClustersCounter_S) {
0184 if (layerMEs_.find(it.first) == layerMEs_.end())
0185 continue;
0186 if (layerMEs_[it.first].nClusters_S != nullptr)
0187 layerMEs_[it.first].nClusters_S->Fill(it.second);
0188 }
0189 numberClusters_->Fill(nclus);
0190 }
0191
0192
0193
0194
0195 void Phase2OTMonitorCluster::bookHistograms(DQMStore::IBooker& ibooker,
0196 edm::Run const& iRun,
0197 edm::EventSetup const& iSetup) {
0198 std::string top_folder = config_.getParameter<std::string>("TopFolderName");
0199 ibooker.cd();
0200 ibooker.setCurrentFolder(top_folder);
0201 edm::LogInfo("Phase2OTMonitorCluster") << " Booking Histograms in: " << top_folder;
0202
0203 numberClusters_ = phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalNClusters"), ibooker);
0204
0205 globalXY_P_ = phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_P"), ibooker);
0206
0207 globalRZ_P_ = phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionRZ_P"), ibooker);
0208
0209 globalXY_S_ = phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_S"), ibooker);
0210
0211 globalRZ_S_ = phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionRZ_S"), ibooker);
0212
0213
0214 edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0215 if (theTkDigiGeomWatcher.check(iSetup)) {
0216 for (auto const& det_u : tkGeom_->detUnits()) {
0217
0218
0219 if ((det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXB ||
0220 det_u->subDetector() == GeomDetEnumerators::SubDetector::P2PXEC))
0221 continue;
0222 unsigned int detId_raw = det_u->geographicalId().rawId();
0223 edm::LogInfo("Phase2ITMonitorRecHit") << "Detid:" << detId_raw << "\tsubdet=" << det_u->subDetector()
0224 << "\t key=" << phase2tkutil::getITHistoId(detId_raw, tTopo_) << std::endl;
0225 bookLayerHistos(ibooker, detId_raw, top_folder);
0226 }
0227 }
0228 }
0229
0230
0231 void Phase2OTMonitorCluster::bookLayerHistos(DQMStore::IBooker& ibooker, uint32_t det_id, std::string& subdir) {
0232 std::string folderName = phase2tkutil::getOTHistoId(det_id, tTopo_);
0233 if (folderName.empty()) {
0234 edm::LogWarning("Phase2OTMonitorCluster") << ">>>> Invalid histo_id ";
0235 return;
0236 }
0237 if (layerMEs_.find(folderName) == layerMEs_.end()) {
0238 ibooker.cd();
0239 ibooker.setCurrentFolder(subdir + "/" + folderName);
0240 edm::LogInfo("Phase2OTMonitorCluster") << " Booking Histograms in: " << subdir + "/" + folderName;
0241 ClusterMEs local_mes;
0242 TrackerGeometry::ModuleType mType = tkGeom_->getDetectorType(det_id);
0243 if (mType == TrackerGeometry::ModuleType::Ph2PSP) {
0244 local_mes.nClusters_P =
0245 phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("NClustersLayer_P"), ibooker);
0246 local_mes.ClusterSize_P =
0247 phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterSize_P"), ibooker);
0248 local_mes.XYGlobalPositionMap_P =
0249 phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_perlayer_P"), ibooker);
0250 local_mes.XYLocalPositionMap_P =
0251 phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("LocalPositionXY_P"), ibooker);
0252 }
0253
0254 local_mes.nClusters_S =
0255 phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("NClustersLayer_S"), ibooker);
0256
0257 local_mes.ClusterSize_S =
0258 phase2tkutil::book1DFromPSet(config_.getParameter<edm::ParameterSet>("ClusterSize_S"), ibooker);
0259
0260 local_mes.XYGlobalPositionMap_S =
0261 phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("GlobalPositionXY_perlayer_S"), ibooker);
0262
0263 local_mes.XYLocalPositionMap_S =
0264 phase2tkutil::book2DFromPSet(config_.getParameter<edm::ParameterSet>("LocalPositionXY_S"), ibooker);
0265
0266 layerMEs_.emplace(folderName, local_mes);
0267 }
0268 }
0269
0270 void Phase2OTMonitorCluster::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0271
0272 edm::ParameterSetDescription desc;
0273 {
0274 edm::ParameterSetDescription psd0;
0275 psd0.add<std::string>("name", "NumberOfClusters");
0276 psd0.add<std::string>("title", ";Number of clusters per event;");
0277 psd0.add<double>("xmin", 0.0);
0278 psd0.add<bool>("switch", true);
0279 psd0.add<double>("xmax", 350000.0);
0280 psd0.add<int>("NxBins", 150);
0281 desc.add<edm::ParameterSetDescription>("GlobalNClusters", psd0);
0282 }
0283 {
0284 edm::ParameterSetDescription psd0;
0285 psd0.add<std::string>("name", "Global_ClusterPosition_XY_P");
0286 psd0.add<std::string>("title", "Global_ClusterPosition_XY_P;x [mm];y [mm];");
0287 psd0.add<int>("NxBins", 1250);
0288 psd0.add<double>("xmin", -1250.0);
0289 psd0.add<double>("xmax", 1250.0);
0290 psd0.add<int>("NyBins", 1250);
0291 psd0.add<double>("ymin", -1250.0);
0292 psd0.add<double>("ymax", 1250.0);
0293 psd0.add<bool>("switch", true);
0294 desc.add<edm::ParameterSetDescription>("GlobalPositionXY_P", psd0);
0295 }
0296 {
0297 edm::ParameterSetDescription psd0;
0298 psd0.add<std::string>("name", "Global_ClusterPosition_XY_S");
0299 psd0.add<std::string>("title", "Global_ClusterPosition_XY_S;x [mm];y [mm];");
0300 psd0.add<int>("NxBins", 1250);
0301 psd0.add<double>("xmin", -1250.0);
0302 psd0.add<double>("xmax", 1250.0);
0303 psd0.add<int>("NyBins", 1250);
0304 psd0.add<double>("ymin", -1250.0);
0305 psd0.add<double>("ymax", 1250.0);
0306 psd0.add<bool>("switch", true);
0307 desc.add<edm::ParameterSetDescription>("GlobalPositionXY_S", psd0);
0308 }
0309
0310 {
0311 edm::ParameterSetDescription psd0;
0312 psd0.add<std::string>("name", "Global_ClusterPosition_RZ_P");
0313 psd0.add<std::string>("title", "Global_ClusterPosition_RZ_P;z [mm];r [mm]");
0314 psd0.add<int>("NxBins", 1500);
0315 psd0.add<double>("xmin", -3000.0);
0316 psd0.add<double>("xmax", 3000.0);
0317 psd0.add<int>("NyBins", 1250);
0318 psd0.add<double>("ymin", 0.0);
0319 psd0.add<double>("ymax", 1250.0);
0320 psd0.add<bool>("switch", true);
0321 desc.add<edm::ParameterSetDescription>("GlobalPositionRZ_P", psd0);
0322 }
0323 {
0324 edm::ParameterSetDescription psd0;
0325 psd0.add<std::string>("name", "Global_ClusterPosition_RZ_S");
0326 psd0.add<std::string>("title", "Global_ClusterPosition_RZ_S;z [mm];r [mm]");
0327 psd0.add<int>("NxBins", 1500);
0328 psd0.add<double>("xmin", -3000.0);
0329 psd0.add<double>("xmax", 3000.0);
0330 psd0.add<int>("NyBins", 1250);
0331 psd0.add<double>("ymin", 0.0);
0332 psd0.add<double>("ymax", 1250.0);
0333 psd0.add<bool>("switch", true);
0334 desc.add<edm::ParameterSetDescription>("GlobalPositionRZ_S", psd0);
0335 }
0336
0337 {
0338 edm::ParameterSetDescription psd0;
0339 psd0.add<std::string>("name", "NumberOfClustersLayerP");
0340 psd0.add<std::string>("title", ";Number of clusters per event(macro pixel sensor);");
0341 psd0.add<double>("xmin", 0.0);
0342 psd0.add<double>("xmax", 28000.0);
0343 psd0.add<int>("NxBins", 150);
0344 psd0.add<bool>("switch", true);
0345 desc.add<edm::ParameterSetDescription>("NClustersLayer_P", psd0);
0346 }
0347 {
0348 edm::ParameterSetDescription psd0;
0349 psd0.add<std::string>("name", "NumberOfClustersLayerS");
0350 psd0.add<std::string>("title", ";Number of clusters per event(strip sensor);");
0351 psd0.add<double>("xmin", 0.0);
0352 psd0.add<double>("xmax", 28000.0);
0353 psd0.add<int>("NxBins", 150);
0354 psd0.add<bool>("switch", true);
0355 desc.add<edm::ParameterSetDescription>("NClustersLayer_S", psd0);
0356 }
0357 {
0358 edm::ParameterSetDescription psd0;
0359 psd0.add<std::string>("name", "ClusterSize_P");
0360 psd0.add<std::string>("title", ";cluster size(macro pixel sensor);");
0361 psd0.add<double>("xmin", -0.5);
0362 psd0.add<double>("xmax", 30.5);
0363 psd0.add<int>("NxBins", 31);
0364 psd0.add<bool>("switch", true);
0365 desc.add<edm::ParameterSetDescription>("ClusterSize_P", psd0);
0366 }
0367 {
0368 edm::ParameterSetDescription psd0;
0369 psd0.add<std::string>("name", "ClusterSize_S");
0370 psd0.add<std::string>("title", ";cluster size(strip sensor);");
0371 psd0.add<double>("xmin", -0.5);
0372 psd0.add<double>("xmax", 30.5);
0373 psd0.add<int>("NxBins", 31);
0374 psd0.add<bool>("switch", true);
0375 desc.add<edm::ParameterSetDescription>("ClusterSize_S", psd0);
0376 }
0377 {
0378 edm::ParameterSetDescription psd0;
0379 psd0.add<std::string>("name", "GlobalPositionXY_perlayer_P");
0380 psd0.add<std::string>("title", "GlobalClusterPositionXY_perlayer_P;x [mm];y [mm];");
0381 psd0.add<int>("NxBins", 1250);
0382 psd0.add<double>("xmin", -1250.0);
0383 psd0.add<double>("xmax", 1250.0);
0384 psd0.add<int>("NyBins", 1250);
0385 psd0.add<double>("ymin", -1250.0);
0386 psd0.add<double>("ymax", 1250.0);
0387 psd0.add<bool>("switch", false);
0388 desc.add<edm::ParameterSetDescription>("GlobalPositionXY_perlayer_P", psd0);
0389 }
0390 {
0391 edm::ParameterSetDescription psd0;
0392 psd0.add<std::string>("name", "GlobalPositionXY_perlayer_S");
0393 psd0.add<std::string>("title", "GlobalClusterPositionXY_perlayer_S;x [mm];y [mm];");
0394 psd0.add<int>("NxBins", 1250);
0395 psd0.add<double>("xmin", -1250.0);
0396 psd0.add<double>("xmax", 1250.0);
0397 psd0.add<int>("NyBins", 1250);
0398 psd0.add<double>("ymin", -1250.0);
0399 psd0.add<double>("ymax", 1250.0);
0400 psd0.add<bool>("switch", false);
0401 desc.add<edm::ParameterSetDescription>("GlobalPositionXY_perlayer_S", psd0);
0402 }
0403 {
0404 edm::ParameterSetDescription psd0;
0405 psd0.add<std::string>("name", "LocalPositionXY_P");
0406 psd0.add<std::string>("title", "LocalPositionXY_P;x ;y ;");
0407 psd0.add<int>("NxBins", 50);
0408 psd0.add<double>("xmin", -10.0);
0409 psd0.add<double>("xmax", 10.0);
0410 psd0.add<int>("NyBins", 50);
0411 psd0.add<double>("ymin", -10.0);
0412 psd0.add<double>("ymax", 10.0);
0413 psd0.add<bool>("switch", true);
0414 desc.add<edm::ParameterSetDescription>("LocalPositionXY_P", psd0);
0415 }
0416 {
0417 edm::ParameterSetDescription psd0;
0418 psd0.add<std::string>("name", "LocalPositionXY_S");
0419 psd0.add<std::string>("title", "LocalPositionXY_S;x ;y ;");
0420 psd0.add<int>("NxBins", 50);
0421 psd0.add<double>("xmin", -10.0);
0422 psd0.add<double>("xmax", 10.0);
0423 psd0.add<int>("NyBins", 50);
0424 psd0.add<double>("ymin", -10.0);
0425 psd0.add<double>("ymax", 10.0);
0426 psd0.add<bool>("switch", true);
0427 desc.add<edm::ParameterSetDescription>("LocalPositionXY_S", psd0);
0428 }
0429
0430 desc.add<std::string>("TopFolderName", "TrackerPhase2OTCluster");
0431 desc.add<edm::InputTag>("clusterSrc", edm::InputTag("siPhase2Clusters"));
0432 descriptions.add("Phase2OTMonitorCluster", desc);
0433 }
0434 DEFINE_FWK_MODULE(Phase2OTMonitorCluster);