File indexing completed on 2024-09-07 04:35:40
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <array>
0019 #include <memory>
0020
0021
0022 #include "FWCore/Framework/interface/Frameworkfwd.h"
0023 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0024
0025 #include "FWCore/Framework/interface/Event.h"
0026 #include "FWCore/Framework/interface/MakerMacros.h"
0027
0028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0029 #include "CondFormats/PCLConfig/interface/AlignPCLThresholds.h"
0030 #include "CondFormats/PCLConfig/interface/AlignPCLThresholdsHG.h"
0031 #include "FWCore/ServiceRegistry/interface/Service.h"
0032 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
0033
0034
0035
0036
0037
0038 namespace DOFs {
0039 enum dof { X, Y, Z, thetaX, thetaY, thetaZ, extraDOF };
0040 }
0041
0042 template <typename T>
0043 class AlignPCLThresholdsWriter : public edm::one::EDAnalyzer<> {
0044 public:
0045 explicit AlignPCLThresholdsWriter(const edm::ParameterSet&);
0046 ~AlignPCLThresholdsWriter() override = default;
0047
0048 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0049
0050 private:
0051 void analyze(const edm::Event&, const edm::EventSetup&) override;
0052 DOFs::dof mapOntoEnum(std::string coord);
0053
0054 void writePayload(T& myThresholds);
0055 void storeHGthresholds(AlignPCLThresholdsHG& myThresholds, const std::vector<std::string>& alignables);
0056
0057
0058 const std::string m_record;
0059 const unsigned int m_minNrecords;
0060 const std::vector<edm::ParameterSet> m_parameters;
0061 };
0062
0063
0064
0065
0066 template <typename T>
0067 AlignPCLThresholdsWriter<T>::AlignPCLThresholdsWriter(const edm::ParameterSet& iConfig)
0068 : m_record(iConfig.getParameter<std::string>("record")),
0069 m_minNrecords(iConfig.getParameter<unsigned int>("minNRecords")),
0070 m_parameters(iConfig.getParameter<std::vector<edm::ParameterSet> >("thresholds")) {}
0071
0072
0073
0074
0075
0076
0077 template <typename T>
0078 void AlignPCLThresholdsWriter<T>::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0079
0080 bool newClass = false;
0081 for (auto& thePSet : m_parameters) {
0082 if (thePSet.exists("fractionCut")) {
0083 newClass = true;
0084 break;
0085 }
0086 }
0087
0088 T myThresholds{};
0089 if constexpr (std::is_same_v<T, AlignPCLThresholdsHG>) {
0090 if (newClass) {
0091 this->writePayload(myThresholds);
0092 } else {
0093 throw cms::Exception("AlignPCLThresholdsWriter") << "mismatched configuration";
0094 }
0095 } else {
0096 if (!newClass) {
0097 this->writePayload(myThresholds);
0098 } else {
0099 throw cms::Exception("AlignPCLThresholdsWriter") << "mismatched configuration";
0100 }
0101 }
0102 }
0103
0104 template <typename T>
0105 DOFs::dof AlignPCLThresholdsWriter<T>::mapOntoEnum(std::string coord) {
0106 if (coord == "X") {
0107 return DOFs::X;
0108 } else if (coord == "Y") {
0109 return DOFs::Y;
0110 } else if (coord == "Z") {
0111 return DOFs::Z;
0112 } else if (coord == "thetaX") {
0113 return DOFs::thetaX;
0114 } else if (coord == "thetaY") {
0115 return DOFs::thetaY;
0116 } else if (coord == "thetaZ") {
0117 return DOFs::thetaZ;
0118 } else {
0119 return DOFs::extraDOF;
0120 }
0121 }
0122
0123
0124 template <typename T>
0125 void AlignPCLThresholdsWriter<T>::writePayload(T& myThresholds) {
0126 using namespace edm;
0127
0128 edm::LogInfo("AlignPCLThresholdsWriter") << "Size of AlignPCLThresholds object " << myThresholds.size() << std::endl;
0129
0130
0131 std::array<std::string, 6> mandatories = {{"X", "Y", "Z", "thetaX", "thetaY", "thetaZ"}};
0132 std::vector<std::string> alignables;
0133
0134
0135 for (auto& thePSet : m_parameters) {
0136 const std::string alignableId(thePSet.getParameter<std::string>("alignableId"));
0137
0138 if (std::find(alignables.begin(), alignables.end(), alignableId) == alignables.end()) {
0139 alignables.push_back(alignableId);
0140 }
0141 }
0142
0143 for (auto& alignable : alignables) {
0144 AlignPCLThreshold::coordThresholds my_X;
0145 AlignPCLThreshold::coordThresholds my_Y;
0146 AlignPCLThreshold::coordThresholds my_Z;
0147 AlignPCLThreshold::coordThresholds my_tX;
0148 AlignPCLThreshold::coordThresholds my_tY;
0149 AlignPCLThreshold::coordThresholds my_tZ;
0150
0151 std::vector<std::string> presentDOF;
0152
0153
0154 std::vector<AlignPCLThreshold::coordThresholds> extraDOFs = std::vector<AlignPCLThreshold::coordThresholds>();
0155
0156 for (auto& thePSet : m_parameters) {
0157 const std::string alignableId(thePSet.getParameter<std::string>("alignableId"));
0158 const std::string DOF(thePSet.getParameter<std::string>("DOF"));
0159
0160 const double cutoff(thePSet.getParameter<double>("cut"));
0161 const double sigCut(thePSet.getParameter<double>("sigCut"));
0162 const double maxMoveCut(thePSet.getParameter<double>("maxMoveCut"));
0163 const double maxErrorCut(thePSet.getParameter<double>("maxErrorCut"));
0164
0165 if (alignableId == alignable) {
0166 presentDOF.push_back(DOF);
0167
0168
0169 switch (mapOntoEnum(DOF)) {
0170 case DOFs::X:
0171 my_X.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0172 break;
0173 case DOFs::Y:
0174 my_Y.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0175 break;
0176 case DOFs::Z:
0177 my_Z.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0178 break;
0179 case DOFs::thetaX:
0180 my_tX.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0181 break;
0182 case DOFs::thetaY:
0183 my_tY.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0184 break;
0185 case DOFs::thetaZ:
0186 my_tZ.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0187 break;
0188 default:
0189 edm::LogInfo("AlignPCLThresholdsWriter")
0190 << "Appending Extra degree of freeedom: " << DOF << " " << mapOntoEnum(DOF) << std::endl;
0191 AlignPCLThreshold::coordThresholds ExtraDOF;
0192 ExtraDOF.setThresholds(cutoff, sigCut, maxErrorCut, maxMoveCut, DOF);
0193 extraDOFs.push_back(ExtraDOF);
0194 }
0195
0196 AlignPCLThreshold a(my_X, my_tX, my_Y, my_tY, my_Z, my_tZ, extraDOFs);
0197 myThresholds.setAlignPCLThreshold(alignableId, a);
0198
0199 }
0200 }
0201
0202
0203 edm::LogInfo("AlignPCLThresholdsWriter")
0204 << "Size of AlignPCLThresholds object " << myThresholds.size() << std::endl;
0205 for (auto& mandatory : mandatories) {
0206 if (std::find(presentDOF.begin(), presentDOF.end(), mandatory) == presentDOF.end()) {
0207 edm::LogWarning("AlignPCLThresholdsWriter")
0208 << "Configuration for DOF: " << mandatory << " for alignable " << alignable << "is not present \n"
0209 << "Will build object with defaults!" << std::endl;
0210 }
0211 }
0212
0213 }
0214
0215
0216 myThresholds.setNRecords(m_minNrecords);
0217 edm::LogInfo("AlignPCLThresholdsWriter") << "Content of AlignPCLThresholds " << std::endl;
0218
0219
0220 if constexpr (std::is_same_v<T, AlignPCLThresholdsHG>) {
0221 storeHGthresholds(myThresholds, alignables);
0222 }
0223
0224
0225 myThresholds.printAll();
0226
0227
0228 edm::Service<cond::service::PoolDBOutputService> poolDbService;
0229 if (poolDbService.isAvailable()) {
0230 cond::Time_t valid_time = poolDbService->currentTime();
0231
0232 poolDbService->writeOneIOV(myThresholds, valid_time, m_record);
0233 }
0234 }
0235
0236
0237 template <typename T>
0238 void AlignPCLThresholdsWriter<T>::storeHGthresholds(AlignPCLThresholdsHG& myThresholds,
0239 const std::vector<std::string>& alignables) {
0240 edm::LogInfo("AlignPCLThresholdsWriter")
0241 << "Found type AlignPCLThresholdsHG, additional thresholds are written" << std::endl;
0242
0243 for (auto& alignable : alignables) {
0244 for (auto& thePSet : m_parameters) {
0245 const std::string alignableId(thePSet.getParameter<std::string>("alignableId"));
0246 const std::string DOF(thePSet.getParameter<std::string>("DOF"));
0247
0248
0249 AlignPCLThresholds::coordType type = static_cast<AlignPCLThresholds::coordType>(mapOntoEnum(DOF));
0250
0251 if (alignableId == alignable) {
0252 if (thePSet.exists("fractionCut")) {
0253 const double fractionCut(thePSet.getParameter<double>("fractionCut"));
0254 myThresholds.setFractionCut(alignableId, type, fractionCut);
0255 }
0256 }
0257 }
0258 }
0259 }
0260
0261
0262 template <typename T>
0263 void AlignPCLThresholdsWriter<T>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0264 edm::ParameterSetDescription desc;
0265 desc.setComment("Plugin to write payloads of type AlignPCLThresholds");
0266 desc.add<unsigned int>("minNRecords", 25000);
0267 edm::ParameterSetDescription desc_thresholds;
0268
0269 desc_thresholds.add<std::string>("alignableId");
0270 desc_thresholds.add<std::string>("DOF");
0271 desc_thresholds.add<double>("cut");
0272 desc_thresholds.add<double>("sigCut");
0273 desc_thresholds.add<double>("maxMoveCut");
0274 desc_thresholds.add<double>("maxErrorCut");
0275 if constexpr (std::is_same_v<T, AlignPCLThresholdsHG>) {
0276 desc.add<std::string>("record", "AlignPCLThresholdsHGRcd");
0277
0278 desc_thresholds.addOptional<double>("fractionCut");
0279 } else {
0280 desc.add<std::string>("record", "AlignPCLThresholdsRcd");
0281 }
0282
0283 std::vector<edm::ParameterSet> default_thresholds(1);
0284 desc.addVPSet("thresholds", desc_thresholds, default_thresholds);
0285 descriptions.addWithDefaultLabel(desc);
0286 }
0287
0288 typedef AlignPCLThresholdsWriter<AlignPCLThresholds> AlignPCLThresholdsLGWriter;
0289 typedef AlignPCLThresholdsWriter<AlignPCLThresholdsHG> AlignPCLThresholdsHGWriter;
0290
0291 DEFINE_FWK_MODULE(AlignPCLThresholdsLGWriter);
0292 DEFINE_FWK_MODULE(AlignPCLThresholdsHGWriter);