File indexing completed on 2023-03-17 10:42:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "FWCore/Framework/interface/MakerMacros.h"
0016 #include "FWCore/Framework/interface/SourceFactory.h"
0017 #include "FWCore/Framework/interface/ESHandle.h"
0018 #include "FWCore/Framework/interface/ESProducer.h"
0019 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0020 #include "FWCore/Framework/interface/ESProducts.h"
0021
0022 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0023
0024 #include "CondFormats/PPSObjects/interface/PPSTimingCalibrationLUT.h"
0025 #include "CondFormats/DataRecord/interface/PPSTimingCalibrationLUTRcd.h"
0026
0027 #include <boost/property_tree/json_parser.hpp>
0028 #include <boost/property_tree/ptree.hpp>
0029
0030 namespace pt = boost::property_tree;
0031
0032
0033
0034 class PPSTimingCalibrationLUTESSource : public edm::ESProducer, public edm::EventSetupRecordIntervalFinder {
0035 public:
0036 PPSTimingCalibrationLUTESSource(const edm::ParameterSet&);
0037
0038 edm::ESProducts<std::unique_ptr<PPSTimingCalibrationLUT> > produce(const PPSTimingCalibrationLUTRcd&);
0039
0040 static void fillDescriptions(edm::ConfigurationDescriptions&);
0041
0042 private:
0043 void setIntervalFor(const edm::eventsetup::EventSetupRecordKey&,
0044 const edm::IOVSyncValue&,
0045 edm::ValidityInterval&) override;
0046
0047
0048 std::unique_ptr<PPSTimingCalibrationLUT> parsePPSDiamondLUTJsonFile() const;
0049
0050 const std::string filename_;
0051 };
0052
0053
0054
0055 PPSTimingCalibrationLUTESSource::PPSTimingCalibrationLUTESSource(const edm::ParameterSet& iConfig)
0056 : filename_(iConfig.getParameter<edm::FileInPath>("calibrationFile").fullPath()) {
0057 setWhatProduced(this);
0058 findingRecord<PPSTimingCalibrationLUTRcd>();
0059 }
0060
0061
0062
0063 edm::ESProducts<std::unique_ptr<PPSTimingCalibrationLUT> > PPSTimingCalibrationLUTESSource::produce(
0064 const PPSTimingCalibrationLUTRcd&) {
0065 return edm::es::products(parsePPSDiamondLUTJsonFile());
0066 }
0067
0068
0069
0070 void PPSTimingCalibrationLUTESSource::setIntervalFor(const edm::eventsetup::EventSetupRecordKey&,
0071 const edm::IOVSyncValue&,
0072 edm::ValidityInterval& oValidity) {
0073 oValidity = edm::ValidityInterval(edm::IOVSyncValue::beginOfTime(), edm::IOVSyncValue::endOfTime());
0074 }
0075
0076
0077
0078 std::unique_ptr<PPSTimingCalibrationLUT> PPSTimingCalibrationLUTESSource::parsePPSDiamondLUTJsonFile() const {
0079 pt::ptree mother_node;
0080 pt::read_json(filename_, mother_node);
0081
0082 PPSTimingCalibrationLUT::BinMap binMap;
0083 for (pt::ptree::value_type& node : mother_node.get_child("calib")) {
0084 PPSTimingCalibrationLUT::Key key;
0085
0086 key.sector = node.second.get<int>("sector");
0087 key.station = node.second.get<int>("station");
0088 key.plane = node.second.get<int>("plane");
0089 key.channel = node.second.get<int>("channel");
0090 std::vector<double> values;
0091 for (pt::ptree::value_type& sample : node.second.get_child("samples")) {
0092 values.emplace_back(std::stod(sample.second.data(), nullptr));
0093 binMap[key] = values;
0094 }
0095 }
0096 return std::make_unique<PPSTimingCalibrationLUT>(binMap);
0097 }
0098
0099 void PPSTimingCalibrationLUTESSource::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0100 edm::ParameterSetDescription desc;
0101 desc.add<edm::FileInPath>("calibrationFile", edm::FileInPath())->setComment("file with calibrations");
0102
0103 descriptions.add("ppsTimingCalibrationLUTESSource", desc);
0104 }
0105
0106 DEFINE_FWK_EVENTSETUP_SOURCE(PPSTimingCalibrationLUTESSource);