Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-31 02:18:52

0001 // -*- C++ -*-
0002 //
0003 // Package:    CastorDbProducer
0004 // Class:      CastorDbProducer
0005 //
0006 /**\class CastorDbProducer CastorDbProducer.h CalibFormats/CastorDbProducer/interface/CastorDbProducer.h
0007 
0008  Description: <one line class summary>
0009 
0010  Implementation:
0011      <Notes on implementation>
0012 */
0013 //
0014 // Original Author:  Fedor Ratnikov
0015 //         Created:  Tue Aug  9 19:10:10 CDT 2005
0016 //         Adapted for CASTOR by L. Mundim
0017 //
0018 //
0019 
0020 // system include files
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   // ----------member data ---------------------------
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   //the following line is needed to tell the framework what
0084   // data is being produced
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   //now do what ever other initialization is needed
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   // do anything here that needs to be done at desctruction time
0105   // (e.g. close files, deallocate resources etc.)
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 // member functions
0119 //
0120 
0121 // ------------ method called to produce the data  ------------
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;  // automatically converts to std::shared_ptr<CastorDbService>
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);