File indexing completed on 2025-01-31 02:18:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <iostream>
0022 #include <fstream>
0023 #include <memory>
0024
0025 #include "FWCore/Framework/interface/ModuleFactory.h"
0026 #include "FWCore/Framework/interface/ESProducer.h"
0027 #include "FWCore/Framework/interface/ESProductHost.h"
0028 #include "FWCore/Utilities/interface/ReusableObjectHolder.h"
0029 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0030
0031 #include "CalibCalorimetry/CastorCalib/interface/CastorDbASCIIIO.h"
0032 #include "CalibFormats/CastorObjects/interface/CastorDbService.h"
0033 #include "CalibFormats/CastorObjects/interface/CastorDbRecord.h"
0034
0035 #include "CondFormats/DataRecord/interface/CastorChannelQualityRcd.h"
0036 #include "CondFormats/DataRecord/interface/CastorElectronicsMapRcd.h"
0037 #include "CondFormats/DataRecord/interface/CastorGainWidthsRcd.h"
0038 #include "CondFormats/DataRecord/interface/CastorGainsRcd.h"
0039 #include "CondFormats/DataRecord/interface/CastorPedestalWidthsRcd.h"
0040 #include "CondFormats/DataRecord/interface/CastorPedestalsRcd.h"
0041 #include "CondFormats/DataRecord/interface/CastorQIEDataRcd.h"
0042 #include "CondFormats/CastorObjects/interface/AllObjects.h"
0043
0044 class CastorDbProducer : public edm::ESProducer {
0045 public:
0046 CastorDbProducer(const edm::ParameterSet&);
0047 ~CastorDbProducer() override;
0048
0049 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0050
0051 std::shared_ptr<CastorDbService> produce(const CastorDbRecord&);
0052
0053 private:
0054
0055 using HostType = edm::ESProductHost<CastorDbService,
0056 CastorPedestalsRcd,
0057 CastorPedestalWidthsRcd,
0058 CastorGainsRcd,
0059 CastorGainWidthsRcd,
0060 CastorQIEDataRcd,
0061 CastorChannelQualityRcd,
0062 CastorElectronicsMapRcd>;
0063
0064 template <typename RecordT, typename TokenT>
0065 void setupItem(const RecordT& fRecord, const TokenT& token, const char* name, CastorDbService* service);
0066
0067 edm::ReusableObjectHolder<HostType> holder_;
0068
0069 edm::ESGetToken<CastorPedestals, CastorPedestalsRcd> pedestalsToken_;
0070 edm::ESGetToken<CastorPedestalWidths, CastorPedestalWidthsRcd> pedestalWidthsToken_;
0071 edm::ESGetToken<CastorGains, CastorGainsRcd> gainsToken_;
0072 edm::ESGetToken<CastorGainWidths, CastorGainWidthsRcd> gainWidthsToken_;
0073 edm::ESGetToken<CastorQIEData, CastorQIEDataRcd> qieDataToken_;
0074 edm::ESGetToken<CastorChannelQuality, CastorChannelQualityRcd> channelQualityToken_;
0075 edm::ESGetToken<CastorElectronicsMap, CastorElectronicsMapRcd> electronicsMapToken_;
0076
0077 std::vector<std::string> mDumpRequest;
0078 std::ostream* mDumpStream;
0079 };
0080
0081 CastorDbProducer::CastorDbProducer(const edm::ParameterSet& fConfig)
0082 : ESProducer(), mDumpRequest(), mDumpStream(nullptr) {
0083
0084
0085 auto cc = setWhatProduced(this);
0086 pedestalsToken_ = cc.consumes();
0087 pedestalWidthsToken_ = cc.consumes();
0088 gainsToken_ = cc.consumes();
0089 gainWidthsToken_ = cc.consumes();
0090 qieDataToken_ = cc.consumes();
0091 channelQualityToken_ = cc.consumes();
0092 electronicsMapToken_ = cc.consumes();
0093
0094
0095
0096 mDumpRequest = fConfig.getUntrackedParameter<std::vector<std::string> >("dump", std::vector<std::string>());
0097 if (!mDumpRequest.empty()) {
0098 std::string otputFile = fConfig.getUntrackedParameter<std::string>("file", "");
0099 mDumpStream = otputFile.empty() ? &std::cout : new std::ofstream(otputFile.c_str());
0100 }
0101 }
0102
0103 CastorDbProducer::~CastorDbProducer() {
0104
0105
0106 if (mDumpStream != &std::cout)
0107 delete mDumpStream;
0108 }
0109
0110 void CastorDbProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0111 edm::ParameterSetDescription desc;
0112 desc.addUntracked<std::vector<std::string> >("dump", std::vector<std::string>());
0113 desc.addUntracked<std::string>("file", "");
0114 descriptions.addWithDefaultLabel(desc);
0115 }
0116
0117
0118
0119
0120
0121
0122 std::shared_ptr<CastorDbService> CastorDbProducer::produce(const CastorDbRecord& record) {
0123 auto host = holder_.makeOrGet([]() { return new HostType; });
0124
0125 bool needBuildCalibrations = false;
0126 bool needBuildCalibWidths = false;
0127
0128 host->ifRecordChanges<CastorElectronicsMapRcd>(
0129 record, [this, h = host.get()](auto const& rec) { setupItem(rec, electronicsMapToken_, "ElectronicsMap", h); });
0130 host->ifRecordChanges<CastorChannelQualityRcd>(
0131 record, [this, h = host.get()](auto const& rec) { setupItem(rec, channelQualityToken_, "ChannelQuality", h); });
0132 host->ifRecordChanges<CastorGainWidthsRcd>(record, [this, h = host.get(), &needBuildCalibWidths](auto const& rec) {
0133 setupItem(rec, gainWidthsToken_, "GainWidths", h);
0134 needBuildCalibWidths = true;
0135 });
0136 host->ifRecordChanges<CastorQIEDataRcd>(
0137 record, [this, h = host.get(), &needBuildCalibrations, &needBuildCalibWidths](auto const& rec) {
0138 setupItem(rec, qieDataToken_, "QIEData", h);
0139 needBuildCalibrations = true;
0140 needBuildCalibWidths = true;
0141 });
0142 host->ifRecordChanges<CastorPedestalWidthsRcd>(record,
0143 [this, h = host.get(), &needBuildCalibWidths](auto const& rec) {
0144 setupItem(rec, pedestalWidthsToken_, "PedestalWidths", h);
0145 needBuildCalibWidths = true;
0146 });
0147 host->ifRecordChanges<CastorGainsRcd>(record, [this, h = host.get(), &needBuildCalibrations](auto const& rec) {
0148 setupItem(rec, gainsToken_, "Gains", h);
0149 needBuildCalibrations = true;
0150 });
0151 host->ifRecordChanges<CastorPedestalsRcd>(record, [this, h = host.get(), &needBuildCalibrations](auto const& rec) {
0152 setupItem(rec, pedestalsToken_, "Pedestals", h);
0153 needBuildCalibrations = true;
0154 });
0155
0156 if (needBuildCalibWidths) {
0157 host->buildCalibWidths();
0158 }
0159
0160 if (needBuildCalibrations) {
0161 host->buildCalibrations();
0162 }
0163
0164 return host;
0165 }
0166
0167 template <typename RecordT, typename TokenT>
0168 void CastorDbProducer::setupItem(const RecordT& fRecord,
0169 const TokenT& token,
0170 const char* name,
0171 CastorDbService* service) {
0172 const auto& item = fRecord.get(token);
0173 service->setData(&item);
0174 if (std::find(mDumpRequest.begin(), mDumpRequest.end(), name) != mDumpRequest.end()) {
0175 *mDumpStream << "New HCAL/CASTOR " << name << " set" << std::endl;
0176 CastorDbASCIIIO::dumpObject(*mDumpStream, item);
0177 }
0178 }
0179
0180 DEFINE_FWK_EVENTSETUP_MODULE(CastorDbProducer);