File indexing completed on 2024-04-06 12:15:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <fstream>
0022 #include <iostream>
0023 #include <memory>
0024 #include <string>
0025 #include <vector>
0026
0027
0028 #include "FWCore/Framework/interface/Frameworkfwd.h"
0029 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0030 #include "FWCore/Framework/interface/Event.h"
0031 #include "FWCore/Framework/interface/EventSetup.h"
0032 #include "FWCore/Framework/interface/MakerMacros.h"
0033 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0034 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0035 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0036 #include "Geometry/HGCalGeometry/interface/HGCalGeometry.h"
0037 #include "Geometry/HGCalCommonData/interface/HGCalDDDConstants.h"
0038 #include "Geometry/HGCalCommonData/interface/HGCalWaferIndex.h"
0039 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0040
0041 class HGCalWaferInFileCheck : public edm::one::EDAnalyzer<> {
0042 public:
0043 explicit HGCalWaferInFileCheck(const edm::ParameterSet&);
0044
0045 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0046
0047 void beginJob() override {}
0048 void analyze(edm::Event const& iEvent, edm::EventSetup const&) override;
0049 void endJob() override {}
0050
0051 private:
0052 const std::string nameSense_, nameDetector_;
0053 const edm::ESGetToken<HGCalGeometry, IdealGeometryRecord> geomToken_;
0054 };
0055
0056 HGCalWaferInFileCheck::HGCalWaferInFileCheck(const edm::ParameterSet& iC)
0057 : nameSense_(iC.getParameter<std::string>("NameSense")),
0058 nameDetector_(iC.getParameter<std::string>("NameDevice")),
0059 geomToken_(esConsumes<HGCalGeometry, IdealGeometryRecord>(edm::ESInputTag{"", nameSense_})) {
0060 edm::LogVerbatim("HGCalGeom") << "Test numbering for " << nameDetector_ << " using constants of " << nameSense_;
0061 }
0062
0063 void HGCalWaferInFileCheck::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0064 edm::ParameterSetDescription desc;
0065 desc.add<std::string>("NameSense", "HGCalEESensitive");
0066 desc.add<std::string>("NameDevice", "HGCal EE");
0067 descriptions.add("hgcalEEWaferInFileCheck", desc);
0068 }
0069
0070
0071 void HGCalWaferInFileCheck::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0072 const auto& geomR = iSetup.getData(geomToken_);
0073 const HGCalGeometry* geom = &geomR;
0074 const auto& hgdc = geom->topology().dddConstants();
0075
0076 edm::LogVerbatim("HGCalGeom") << nameDetector_ << "\nCheck Wafers in file are all valid for " << nameDetector_
0077 << "\n";
0078 if (hgdc.waferHexagon8()) {
0079 DetId::Detector det = (nameSense_ == "HGCalHESiliconSensitive") ? DetId::HGCalHSi : DetId::HGCalEE;
0080 edm::LogVerbatim("HGCalGeom")
0081 << "Old Partial types: 1|Five, 2|ChopTwo, 3|ChopTwoM, 4|Half, 5|Semi, 6|Semi2, 7|Three, 8|Half2, 9|Five2\nNew "
0082 "Partial types: 11|LDTop, 12|LDBottom, 13|LDLeft, 14|LDRight, 15|LDFive, 16|LDThree, 21|HDTop, 22|HDBottom, "
0083 "23|HDLeft, 24|HDRight, 25|HDFive\nCommon Partial types: 0|Full, 99|Out";
0084
0085 int bad1(0);
0086 for (unsigned int k = 0; k < hgdc.waferFileSize(); ++k) {
0087 int indx = hgdc.waferFileIndex(k);
0088 int layer = HGCalWaferIndex::waferLayer(indx);
0089 int waferU = HGCalWaferIndex::waferU(indx);
0090 int waferV = HGCalWaferIndex::waferV(indx);
0091 int type = std::get<0>(hgdc.waferFileInfo(k));
0092 HGCSiliconDetId id(det, 1, type, layer, waferU, waferV, 0, 0);
0093 if (!geom->topology().validModule(id, 3)) {
0094 int part = std::get<1>(hgdc.waferFileInfoFromIndex(indx));
0095 const auto& xy = hgdc.waferPosition(layer, waferU, waferV, true, false);
0096 edm::LogVerbatim("HGCalGeom") << "ID[" << k << "]: (" << (hgdc.getLayerOffset() + layer) << ", " << waferU
0097 << ", " << waferV << ", " << part << ") at (" << std::setprecision(4) << xy.first
0098 << ", " << xy.second << ", " << hgdc.waferZ(layer, true) << ") not valid";
0099 ++bad1;
0100 }
0101 }
0102 edm::LogVerbatim("HGCalGeom") << "\n\nFinds " << bad1 << " invalid wafers among " << hgdc.waferFileSize()
0103 << " wafers in the list\n";
0104
0105
0106 auto const& ids = geom->getValidGeomDetIds();
0107 int all(0), bad2(0), xtra(0);
0108 for (unsigned int k = 0; k < ids.size(); ++k) {
0109 HGCSiliconDetId id(ids[k]);
0110 if ((ids[k].rawId() != 0) && (id.zside() == 1)) {
0111 ++all;
0112 int indx = HGCalWaferIndex::waferIndex(id.layer(), id.waferU(), id.waferV());
0113 if (!hgdc.waferFileInfoExist(indx)) {
0114 int part = hgdc.waferTypeRotation(id.layer(), id.waferU(), id.waferV(), false, false).first;
0115 if (part != HGCalTypes::WaferOut) {
0116 const auto& xy = hgdc.waferPosition(id.layer(), id.waferU(), id.waferV(), true, false);
0117 edm::LogVerbatim("HGCalGeom")
0118 << "ID[" << k << "]: (" << (hgdc.getLayerOffset() + id.layer()) << ", " << id.waferU() << ", "
0119 << id.waferV() << ", " << part << ") at (" << std::setprecision(4) << xy.first << ", " << xy.second
0120 << ", " << hgdc.waferZ(id.layer(), true) << ") not in wafer-list";
0121 ++bad2;
0122 } else {
0123 ++xtra;
0124 }
0125 }
0126 }
0127 }
0128 edm::LogVerbatim("HGCalGeom") << "\n\nFinds " << bad2 << " missing wafers among " << all << " valid wafers and "
0129 << xtra << " extra ones\n";
0130
0131
0132 int allG(0), badT(0), badP(0), badP2(0), badR(0), badG(0), badT1(0), badT2(0);
0133 for (unsigned int k = 0; k < hgdc.waferFileSize(); ++k) {
0134 int indx = hgdc.waferFileIndex(k);
0135 int type1 = std::get<0>(hgdc.waferFileInfo(k));
0136 int part1 = std::get<1>(hgdc.waferFileInfo(k));
0137 int rotn1 = std::get<2>(hgdc.waferFileInfo(k));
0138 int layer = HGCalWaferIndex::waferLayer(indx);
0139 int waferU = HGCalWaferIndex::waferU(indx);
0140 int waferV = HGCalWaferIndex::waferV(indx);
0141 int type2 = hgdc.waferType(layer, waferU, waferV, false);
0142 HGCSiliconDetId id(det, 1, type2, layer, waferU, waferV, 0, 0);
0143 if (geom->topology().validModule(id, 3)) {
0144 ++allG;
0145 int part2 = hgdc.waferTypeRotation(id.layer(), id.waferU(), id.waferV(), false, false).first;
0146 int rotn2 = hgdc.waferTypeRotation(id.layer(), id.waferU(), id.waferV(), false, false).second;
0147 bool typeOK = (type1 == type2);
0148 bool partOK = ((part1 == part2) || ((part1 == HGCalTypes::WaferFull) && (part2 == HGCalTypes::WaferOut)) ||
0149 ((part2 == HGCalTypes::WaferFull) && (part1 != HGCalTypes::WaferOut)));
0150 bool rotnOK = ((rotn1 == rotn2) || (part1 == HGCalTypes::WaferFull) || (part2 == HGCalTypes::WaferFull));
0151 if (part1 < part2)
0152 ++badP2;
0153 if (!typeOK) {
0154 ++badT;
0155 if (type1 == 0)
0156 ++badT1;
0157 else if (type2 == 0)
0158 ++badT2;
0159 }
0160 if (!partOK)
0161 ++badP;
0162 if (!rotnOK)
0163 ++badR;
0164 if ((!typeOK) || (!partOK) || (!rotnOK)) {
0165 ++badG;
0166 const auto& xy = hgdc.waferPosition(layer, waferU, waferV, true, false);
0167 edm::LogVerbatim("HGCalGeom") << "ID[" << k << "]: (" << (hgdc.getLayerOffset() + layer) << ", " << waferU
0168 << ", " << waferV << ", " << type1 << ":" << type2 << ", " << part1 << ":"
0169 << part2 << ", " << rotn1 << ":" << rotn2 << ") at (" << std::setprecision(4)
0170 << xy.first << ", " << xy.second << ", " << hgdc.waferZ(layer, true)
0171 << ") failure flag " << typeOK << ":" << partOK << ":" << rotnOK << ":"
0172 << (part1 >= part2);
0173 }
0174 }
0175 }
0176 edm::LogVerbatim("HGCalGeom") << "\n\nFinds " << badG << " (" << badT << "[" << badT1 << ":" << badT2
0177 << "]:" << badP << ":" << badP2 << ":" << badR << ") mismatch among " << allG
0178 << " wafers with the same indices";
0179 }
0180 }
0181
0182
0183 DEFINE_FWK_MODULE(HGCalWaferInFileCheck);