File indexing completed on 2023-03-17 10:48:49
0001
0002 #include <memory>
0003 #include <cstdio>
0004 #include <string>
0005
0006
0007 #include "CommonTools/ConditionDBWriter/interface/ConditionDBWriter.h"
0008 #include "CondFormats/SiStripObjects/interface/SiStripBadStrip.h"
0009 #include "DataFormats/FEDRawData/interface/FEDNumbering.h"
0010 #include "FWCore/Framework/interface/Frameworkfwd.h"
0011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0012 #include "FWCore/ParameterSet/interface/FileInPath.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0015 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
0016 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
0017 #include "Geometry/CommonTopologies/interface/StripTopology.h"
0018 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
0019 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetType.h"
0020 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
0021 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
0022
0023 class SiStripBadStripFromASCIIFile : public ConditionDBWriter<SiStripBadStrip> {
0024 public:
0025 explicit SiStripBadStripFromASCIIFile(const edm::ParameterSet& iConfig);
0026 ~SiStripBadStripFromASCIIFile() override = default;
0027 static void fillDescriptions(edm::ConfigurationDescriptions&);
0028
0029 private:
0030 std::unique_ptr<SiStripBadStrip> getNewObject() override;
0031 const bool printdebug_;
0032 const bool isFlagAvailable_;
0033 const edm::FileInPath fp_;
0034 };
0035
0036 using namespace std;
0037 SiStripBadStripFromASCIIFile::SiStripBadStripFromASCIIFile(const edm::ParameterSet& iConfig)
0038 : ConditionDBWriter<SiStripBadStrip>(iConfig),
0039 printdebug_(iConfig.getParameter<bool>("printDebug")),
0040 isFlagAvailable_(iConfig.getParameter<bool>("isFlagAvailable")),
0041 fp_(iConfig.getParameter<edm::FileInPath>("file")) {}
0042
0043 void SiStripBadStripFromASCIIFile::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0044 edm::ParameterSetDescription desc;
0045 ConditionDBWriter::fillPSetDescription(desc);
0046 desc.setComment("Conditions Builder for SiStripBadStrip Objects from input ASCII file");
0047 desc.add<edm::FileInPath>("file", edm::FileInPath("CondTools/SiStrip/data/DefectsFromConstructionDB.dat"));
0048 desc.add<bool>("printDebug", false)->setComment("prints debug level messages");
0049 desc.add<bool>("isFlagAvailable", true)->setComment("is the flag available in the input file");
0050 descriptions.addWithDefaultLabel(desc);
0051 }
0052
0053 std::unique_ptr<SiStripBadStrip> SiStripBadStripFromASCIIFile::getNewObject() {
0054 auto SiStripBadStrip_ = std::make_unique<SiStripBadStrip>();
0055
0056
0057 ifstream infile((fp_.fullPath()).c_str());
0058 if (!infile) {
0059 edm::LogError("SiStripBadStripFromASCIIFile") << "[SiStripBadStripFromASCIIFile::GetNewObject]"
0060 << " Problem while trying to open File: " << (fp_.fullPath()).c_str();
0061 }
0062
0063
0064 uint32_t detid;
0065 short flag;
0066 short channel;
0067
0068 bool firstrun = true;
0069 short tempchannel = 0;
0070 int count = 0;
0071 std::vector<unsigned int> theSiStripVector;
0072 short tempflag = 0;
0073 uint32_t tempdetid = 0;
0074
0075 while (!infile.eof()) {
0076
0077 if (isFlagAvailable_) {
0078 infile >> detid >> channel >> flag;
0079 } else {
0080
0081 infile >> detid >> channel;
0082 flag = 1;
0083 }
0084
0085 unsigned int theBadStripRange = 0;
0086
0087
0088 if (firstrun) {
0089 tempdetid = detid;
0090 tempchannel = channel;
0091 tempflag = flag;
0092 count = 0;
0093 firstrun = false;
0094 }
0095
0096 if (detid == tempdetid) {
0097 if (channel != tempchannel + count || flag != tempflag) {
0098
0099 theBadStripRange = SiStripBadStrip_->encode(
0100 tempchannel - 1,
0101 count,
0102 tempflag);
0103
0104
0105 if (printdebug_) {
0106 edm::LogInfo("SiStripBadStripFromASCIIFile")
0107 << "detid " << tempdetid << " \t"
0108 << " firstBadStrip " << tempchannel << "\t "
0109 << " NconsecutiveBadStrips " << count << "\t "
0110 << "flag " << tempflag << "\t"
0111 << " packed integer " << std::hex << theBadStripRange << std::dec;
0112 }
0113
0114 theSiStripVector.push_back(theBadStripRange);
0115
0116 if (infile.eof()) {
0117 SiStripBadStrip::Range range(theSiStripVector.begin(), theSiStripVector.end());
0118 if (!SiStripBadStrip_->put(tempdetid, range))
0119 edm::LogError("SiStripBadStripFromASCIIFile")
0120 << "[SiStripBadStripFromASCIIFile::GetNewObject] detid already exists";
0121 theSiStripVector.clear();
0122 }
0123
0124 count = 1;
0125 tempchannel = channel;
0126 tempflag = flag;
0127
0128 } else {
0129 count++;
0130 }
0131 }
0132
0133 if (detid != tempdetid) {
0134
0135 theBadStripRange = SiStripBadStrip_->encode(
0136 tempchannel - 1,
0137 count,
0138 tempflag);
0139
0140 if (printdebug_) {
0141 edm::LogInfo("SiStripBadStripFromASCIIFile") << "detid " << tempdetid << " \t"
0142 << " firstBadStrip " << tempchannel << "\t "
0143 << " NconsecutiveBadStrips " << count << "\t "
0144 << "flag " << tempflag << "\t"
0145 << " packed integer " << std::hex << theBadStripRange << std::dec;
0146 }
0147
0148 theSiStripVector.push_back(theBadStripRange);
0149
0150
0151 SiStripBadStrip::Range range(theSiStripVector.begin(), theSiStripVector.end());
0152 if (!SiStripBadStrip_->put(tempdetid, range))
0153 edm::LogError("SiStripBadStripFromASCIIFile")
0154 << "[SiStripBadStripFromASCIIFile::GetNewObject] detid already exists";
0155 theSiStripVector.clear();
0156
0157 count = 1;
0158 tempdetid = detid;
0159 tempchannel = channel;
0160 tempflag = flag;
0161 }
0162 }
0163
0164 return SiStripBadStrip_;
0165 }
0166
0167 #include "FWCore/Framework/interface/MakerMacros.h"
0168 DEFINE_FWK_MODULE(SiStripBadStripFromASCIIFile);