Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //bookLayer
0003 // Package:    Phase2OTMonitorCluster
0004 // Class:      Phase2OTMonitorCluster
0005 //
0006 /**\class Phase2OTMonitorCluster Phase2OTMonitorCluster.cc 
0007 
0008  Description: Validation plots tracker clusters. 
0009 
0010 */
0011 //
0012 // Author: Gabriel Ramirez
0013 // Date: May 23, 2020
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 // DQM Histograming
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 // constructors
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 // -- DQM Begin Run
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 // -- Analyze
0104 //
0105 void Phase2OTMonitorCluster::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0106   // Getting the clusters
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   // Number of clusters
0115   std::map<std::string, unsigned int> nClustersCounter_P;  //map of detidkey vs #cls
0116   std::map<std::string, unsigned int> nClustersCounter_S;  //map of detidkey vs #cls
0117   unsigned int nclus = 0;                                  //global counter
0118   for (const auto& DSVItr : *clusterHandle) {
0119     // Getting the id of detector unit
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     // initialize the nhit counters if they don't exist for this layer
0130     //the check on the detId is needed to avoid checking at the filling stage
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)  //make this optional
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)  //make this optional
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)  //this check should not be required though
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)  //this check should not be required though
0187       layerMEs_[it.first].nClusters_S->Fill(it.second);
0188   }
0189   numberClusters_->Fill(nclus);
0190 }
0191 
0192 //
0193 // -- Book Histograms
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   //Now book layer wise histos
0214   edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0215   if (theTkDigiGeomWatcher.check(iSetup)) {
0216     for (auto const& det_u : tkGeom_->detUnits()) {
0217       //Always check TrackerNumberingBuilder before changing this part
0218       //continue if Pixel
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 //////////////////Layer Histo/////////////////////////////////
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   }  //if block layerME find
0268 }
0269 
0270 void Phase2OTMonitorCluster::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0271   // rechitMonitorOT
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   //Layer wise parameter
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);