File indexing completed on 2024-04-06 12:30:56
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #include <memory>
0018 #include "FWCore/Framework/interface/Frameworkfwd.h"
0019 #include "FWCore/Framework/interface/MakerMacros.h"
0020 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0021 #include "FWCore/Framework/interface/Event.h"
0022 #include "FWCore/ServiceRegistry/interface/Service.h"
0023 #include "FWCore/Framework/interface/ESWatcher.h"
0024 #include "FWCore/Utilities/interface/InputTag.h"
0025 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0026 #include "DataFormats/Common/interface/Handle.h"
0027 #include "DataFormats/DetId/interface/DetId.h"
0028 #include "DataFormats/Common/interface/DetSetVector.h"
0029 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0030 #include "DataFormats/Common/interface/DetSetVector.h"
0031 #include "DataFormats/Phase2TrackerDigi/interface/Phase2TrackerDigi.h"
0032 #include "DataFormats/Math/interface/deltaPhi.h"
0033 #include "DataFormats/GeometryCommonDetAlgo/interface/MeasurementPoint.h"
0034 #include "SimDataFormats/TrackerDigiSimLink/interface/PixelDigiSimLink.h"
0035 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
0036 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0037
0038 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0039 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0040 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0041 #include "Geometry/CommonDetUnit/interface/PixelGeomDetUnit.h"
0042 #include "Geometry/CommonDetUnit/interface/PixelGeomDetType.h"
0043
0044 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0045
0046
0047 #include "DQMServices/Core/interface/DQMStore.h"
0048 #include <cmath>
0049
0050 using Phase2TrackerGeomDetUnit = PixelGeomDetUnit;
0051
0052 class TBeamTest : public DQMEDAnalyzer {
0053 public:
0054 explicit TBeamTest(const edm::ParameterSet&);
0055 ~TBeamTest() override;
0056 void bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override;
0057 void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override;
0058
0059 struct DigiMEs {
0060 MonitorElement* NumberOfDigis;
0061 MonitorElement* PositionOfDigis;
0062 MonitorElement* NumberOfClusters;
0063 std::vector<MonitorElement*> ClusterWidths;
0064 MonitorElement* ClusterPosition;
0065 };
0066
0067 private:
0068 int matchedSimTrackIndex(edm::Handle<edm::DetSetVector<PixelDigiSimLink> >& linkHandle,
0069 edm::Handle<edm::SimTrackContainer>& simTkHandle,
0070 DetId detId,
0071 unsigned int& channel);
0072
0073 void fillClusterWidth(DigiMEs& mes, float dphi, float width);
0074 edm::ParameterSet config_;
0075 std::map<std::string, DigiMEs> detMEs;
0076 const edm::InputTag otDigiSrc_;
0077 const edm::InputTag digiSimLinkSrc_;
0078 const edm::InputTag simTrackSrc_;
0079 const std::string geomType_;
0080
0081 const std::vector<double> phiValues;
0082 const edm::EDGetTokenT<edm::DetSetVector<Phase2TrackerDigi> > otDigiToken_;
0083 const edm::EDGetTokenT<edm::DetSetVector<PixelDigiSimLink> > otDigiSimLinkToken_;
0084 const edm::EDGetTokenT<edm::SimTrackContainer> simTrackToken_;
0085 const edm::ESGetToken<TrackerTopology, TrackerTopologyRcd> topoToken_;
0086 const edm::ESGetToken<TrackerGeometry, TrackerDigiGeometryRecord> geomToken_;
0087 };
0088
0089
0090
0091 TBeamTest::TBeamTest(const edm::ParameterSet& iConfig)
0092 : config_(iConfig),
0093 otDigiSrc_(iConfig.getParameter<edm::InputTag>("OuterTrackerDigiSource")),
0094 digiSimLinkSrc_(iConfig.getParameter<edm::InputTag>("OuterTrackerDigiSimSource")),
0095 simTrackSrc_(iConfig.getParameter<edm::InputTag>("SimTrackSource")),
0096 geomType_(iConfig.getParameter<std::string>("GeometryType")),
0097 phiValues(iConfig.getParameter<std::vector<double> >("PhiAngles")),
0098 otDigiToken_(consumes<edm::DetSetVector<Phase2TrackerDigi> >(otDigiSrc_)),
0099 otDigiSimLinkToken_(consumes<edm::DetSetVector<PixelDigiSimLink> >(digiSimLinkSrc_)),
0100 simTrackToken_(consumes<edm::SimTrackContainer>(simTrackSrc_)),
0101 topoToken_(esConsumes<TrackerTopology, TrackerTopologyRcd>()),
0102 geomToken_(esConsumes<TrackerGeometry, TrackerDigiGeometryRecord>(edm::ESInputTag{"", geomType_})) {
0103 edm::LogInfo("TBeamTest") << ">>> Construct TBeamTest ";
0104 }
0105
0106
0107
0108
0109 TBeamTest::~TBeamTest() {
0110
0111
0112 edm::LogInfo("TBeamTest") << ">>> Destroy TBeamTest ";
0113 }
0114
0115
0116
0117 void TBeamTest::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0118 using namespace edm;
0119
0120
0121
0122 edm::Handle<edm::DetSetVector<PixelDigiSimLink> > digiSimLinkHandle;
0123 iEvent.getByToken(otDigiSimLinkToken_, digiSimLinkHandle);
0124
0125 edm::Handle<edm::DetSetVector<Phase2TrackerDigi> > otDigiHandle;
0126 iEvent.getByToken(otDigiToken_, otDigiHandle);
0127 const DetSetVector<Phase2TrackerDigi>* digis = otDigiHandle.product();
0128
0129
0130 edm::Handle<edm::SimTrackContainer> simTrackHandle;
0131 iEvent.getByToken(simTrackToken_, simTrackHandle);
0132
0133 const TrackerTopology* tTopo = &iSetup.getData(topoToken_);
0134
0135 edm::ESWatcher<TrackerDigiGeometryRecord> theTkDigiGeomWatcher;
0136 if (theTkDigiGeomWatcher.check(iSetup)) {
0137 const TrackerGeometry* tkGeom = &iSetup.getData(geomToken_);
0138
0139 edm::DetSetVector<Phase2TrackerDigi>::const_iterator DSViter;
0140 std::string moduleType;
0141 for (DSViter = digis->begin(); DSViter != digis->end(); DSViter++) {
0142 unsigned int rawid = DSViter->id;
0143 DetId detId(rawid);
0144 if (detId.det() != DetId::Detector::Tracker)
0145 continue;
0146
0147 if (detId.subdetId() != StripSubdetector::TOB)
0148 continue;
0149 int layer = tTopo->getOTLayerNumber(rawid);
0150 if (layer != 4)
0151 continue;
0152
0153 const GeomDetUnit* geomDetUnit = tkGeom->idToDetUnit(detId);
0154
0155 const Phase2TrackerGeomDetUnit* tkDetUnit = dynamic_cast<const Phase2TrackerGeomDetUnit*>(geomDetUnit);
0156 int nColumns = tkDetUnit->specificTopology().ncolumns();
0157
0158 edm::LogInfo("TBeamTest") << " Det Id = " << rawid;
0159
0160 if (layer <= 3) {
0161 if (nColumns > 2)
0162 moduleType = "PSP_Modules";
0163 else
0164 moduleType = "PSS_Modules";
0165 } else
0166 moduleType = "2S_Modules";
0167
0168 std::map<std::string, DigiMEs>::iterator pos = detMEs.find(moduleType);
0169 if (pos != detMEs.end()) {
0170 DigiMEs local_mes = pos->second;
0171 int nDigi = 0;
0172 int row_last = -1;
0173 int col_last = -1;
0174 int nclus = 0;
0175 int width = 1;
0176 int position = 0;
0177 float dPhi = 9999.9;
0178 for (DetSet<Phase2TrackerDigi>::const_iterator di = DSViter->begin(); di != DSViter->end(); di++) {
0179 int col = di->column();
0180 int row = di->row();
0181 MeasurementPoint mp(row + 0.5, col + 0.5);
0182 unsigned int channel = Phase2TrackerDigi::pixelToChannel(row, col);
0183 int tkIndx = matchedSimTrackIndex(digiSimLinkHandle, simTrackHandle, detId, channel);
0184
0185 if (geomDetUnit && tkIndx != -1)
0186 dPhi = reco::deltaPhi((*simTrackHandle)[tkIndx].momentum().phi(), geomDetUnit->position().phi());
0187
0188 nDigi++;
0189 edm::LogInfo("TBeamTest") << " column " << col << " row " << row << std::endl;
0190 local_mes.PositionOfDigis->Fill(row + 1);
0191
0192 if (row_last == -1) {
0193 width = 1;
0194 position = row + 1;
0195 nclus++;
0196 } else {
0197 if (abs(row - row_last) == 1 && col == col_last) {
0198 position += row + 1;
0199 width++;
0200 } else {
0201 position /= width;
0202 fillClusterWidth(local_mes, dPhi, width);
0203 local_mes.ClusterPosition->Fill(position);
0204 width = 1;
0205 position = row + 1;
0206 nclus++;
0207 }
0208 }
0209 edm::LogInfo("TBeamTest") << " row " << row << " col " << col << " row_last " << row_last << " col_last "
0210 << col_last << " width " << width;
0211 row_last = row;
0212 col_last = col;
0213 }
0214 position /= width;
0215 fillClusterWidth(local_mes, dPhi, width);
0216 local_mes.ClusterPosition->Fill(position);
0217 local_mes.NumberOfClusters->Fill(nclus);
0218 local_mes.NumberOfDigis->Fill(nDigi);
0219 }
0220 }
0221 }
0222 }
0223
0224
0225
0226 void TBeamTest::bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) {
0227 std::string top_folder = config_.getParameter<std::string>("TopFolderName");
0228
0229 std::vector<std::string> types;
0230 types.push_back("2S_Modules");
0231 types.push_back("PSP_Modules");
0232 types.push_back("PSS_Modules");
0233 ibooker.cd();
0234
0235 for (const auto& itype : types) {
0236 std::stringstream folder_name;
0237
0238 folder_name << top_folder << "/" << itype;
0239
0240 edm::LogInfo("TBeamTest") << " Booking Histograms in : " << folder_name.str();
0241 ibooker.setCurrentFolder(folder_name.str());
0242
0243 std::ostringstream HistoName;
0244
0245 DigiMEs local_mes;
0246 edm::ParameterSet Parameters = config_.getParameter<edm::ParameterSet>("NumberOfDigisH");
0247 HistoName.str("");
0248 HistoName << "numberOfHits";
0249 local_mes.NumberOfDigis = ibooker.book1D(HistoName.str(),
0250 HistoName.str(),
0251 Parameters.getParameter<int32_t>("Nbins"),
0252 Parameters.getParameter<double>("xmin"),
0253 Parameters.getParameter<double>("xmax"));
0254
0255 Parameters = config_.getParameter<edm::ParameterSet>("PositionOfDigisH");
0256 HistoName.str("");
0257 HistoName << "hitPositions";
0258 local_mes.PositionOfDigis = ibooker.book1D(HistoName.str(),
0259 HistoName.str(),
0260 Parameters.getParameter<int32_t>("Nxbins"),
0261 Parameters.getParameter<double>("xmin"),
0262 Parameters.getParameter<double>("xmax"));
0263 Parameters = config_.getParameter<edm::ParameterSet>("NumberOfClustersH");
0264 HistoName.str("");
0265 HistoName << "numberOfCluetsrs";
0266 local_mes.NumberOfClusters = ibooker.book1D(HistoName.str(),
0267 HistoName.str(),
0268 Parameters.getParameter<int32_t>("Nbins"),
0269 Parameters.getParameter<double>("xmin"),
0270 Parameters.getParameter<double>("xmax"));
0271 Parameters = config_.getParameter<edm::ParameterSet>("ClusterWidthH");
0272
0273 for (unsigned int i = 0; i < phiValues.size(); i++) {
0274 HistoName.str("");
0275 HistoName << "clusterWidth_";
0276 HistoName << i;
0277
0278 local_mes.ClusterWidths.push_back(ibooker.book1D(HistoName.str(),
0279 HistoName.str(),
0280 Parameters.getParameter<int32_t>("Nbins"),
0281 Parameters.getParameter<double>("xmin"),
0282 Parameters.getParameter<double>("xmax")));
0283 }
0284 Parameters = config_.getParameter<edm::ParameterSet>("ClusterPositionH");
0285 HistoName.str("");
0286 HistoName << "clusterPositions";
0287 local_mes.ClusterPosition = ibooker.book1D(HistoName.str(),
0288 HistoName.str(),
0289 Parameters.getParameter<int32_t>("Nbins"),
0290 Parameters.getParameter<double>("xmin"),
0291 Parameters.getParameter<double>("xmax"));
0292 detMEs.insert(std::make_pair(itype, local_mes));
0293 }
0294 }
0295 int TBeamTest::matchedSimTrackIndex(edm::Handle<edm::DetSetVector<PixelDigiSimLink> >& linkHandle,
0296 edm::Handle<edm::SimTrackContainer>& simTkHandle,
0297 DetId detId,
0298 unsigned int& channel) {
0299 int simTrkIndx = -1;
0300 unsigned int simTrkId = 0;
0301 edm::DetSetVector<PixelDigiSimLink>::const_iterator isearch = linkHandle->find(detId);
0302
0303 if (isearch == linkHandle->end())
0304 return simTrkIndx;
0305
0306 edm::DetSet<PixelDigiSimLink> link_detset = (*linkHandle)[detId];
0307
0308 for (edm::DetSet<PixelDigiSimLink>::const_iterator it = link_detset.data.begin(); it != link_detset.data.end();
0309 it++) {
0310 if (channel == it->channel()) {
0311 simTrkId = it->SimTrackId();
0312 break;
0313 }
0314 }
0315 if (simTrkId == 0)
0316 return simTrkIndx;
0317 edm::SimTrackContainer sim_tracks = (*simTkHandle.product());
0318 for (unsigned int itk = 0; itk < sim_tracks.size(); itk++) {
0319 if (sim_tracks[itk].trackId() == simTrkId) {
0320 simTrkIndx = itk;
0321 break;
0322 }
0323 }
0324 return simTrkIndx;
0325 }
0326 void TBeamTest::fillClusterWidth(DigiMEs& mes, float dphi, float width) {
0327 for (unsigned int i = 0; i < phiValues.size(); i++) {
0328 float angle_min = (phiValues[i] - 0.1) * std::acos(-1.0) / 180.0;
0329 float angle_max = (phiValues[i] + 0.1) * std::acos(-1.0) / 180.0;
0330 if (std::fabs(dphi) > angle_min && std::fabs(dphi) < angle_max) {
0331 mes.ClusterWidths[i]->Fill(width);
0332 break;
0333 }
0334 }
0335 }
0336
0337 DEFINE_FWK_MODULE(TBeamTest);