File indexing completed on 2024-04-06 12:01:31
0001 #include "FWCore/Framework/interface/Event.h"
0002 #include "FWCore/Framework/interface/MakerMacros.h"
0003 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0004 #include "FWCore/ServiceRegistry/interface/Service.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "CondCore/DBOutputService/interface/OnlineDBOutputService.h"
0007 #include "CondFormats/BeamSpotObjects/interface/BeamSpotObjects.h"
0008
0009 #include <iostream>
0010 #include <string>
0011 #include <chrono>
0012
0013 namespace edm {
0014 class ParameterSet;
0015 class Event;
0016 class EventSetup;
0017 }
0018
0019
0020 class LumiBasedUpdateAnalyzer : public edm::one::EDAnalyzer<> {
0021 public:
0022 explicit LumiBasedUpdateAnalyzer(const edm::ParameterSet& iConfig);
0023 virtual ~LumiBasedUpdateAnalyzer();
0024 virtual void beginJob();
0025 virtual void endJob();
0026 virtual void beginLuminosityBlock(const edm::LuminosityBlock& lumiSeg, const edm::EventSetup& context);
0027 virtual void endLuminosityBlock(const edm::LuminosityBlock& lumiSeg, const edm::EventSetup& iSetup);
0028 virtual void analyze(const edm::Event& evt, const edm::EventSetup& evtSetup);
0029
0030 private:
0031 std::string m_record;
0032 unsigned int m_iovSize;
0033 std::string m_lumiFile;
0034 cond::Time_t m_lastLumi;
0035 unsigned int m_nLumi;
0036 int m_ret;
0037 };
0038
0039 LumiBasedUpdateAnalyzer::LumiBasedUpdateAnalyzer(const edm::ParameterSet& iConfig)
0040 : m_record(iConfig.getUntrackedParameter<std::string>("record")),
0041 m_iovSize(iConfig.getUntrackedParameter<unsigned int>("iovSize")),
0042 m_lumiFile(iConfig.getUntrackedParameter<std::string>("lastLumiFile")),
0043 m_nLumi(0),
0044 m_ret(-2) {}
0045
0046 LumiBasedUpdateAnalyzer::~LumiBasedUpdateAnalyzer() {}
0047
0048 void LumiBasedUpdateAnalyzer::beginJob() {
0049 edm::Service<cond::service::OnlineDBOutputService> mydbservice;
0050 if (!mydbservice.isAvailable()) {
0051 return;
0052 }
0053 mydbservice->lockRecords();
0054 }
0055
0056 void LumiBasedUpdateAnalyzer::endJob() {
0057 edm::Service<cond::service::OnlineDBOutputService> mydbservice;
0058 if (mydbservice.isAvailable()) {
0059 mydbservice->releaseLocks();
0060 }
0061 }
0062
0063 void LumiBasedUpdateAnalyzer::beginLuminosityBlock(const edm::LuminosityBlock& lumiSeg,
0064 const edm::EventSetup& context) {}
0065
0066 void LumiBasedUpdateAnalyzer::endLuminosityBlock(const edm::LuminosityBlock& lumiSeg, const edm::EventSetup& iSetup) {}
0067
0068 void LumiBasedUpdateAnalyzer::analyze(const edm::Event& evt, const edm::EventSetup& evtSetup) {
0069 edm::Service<cond::service::OnlineDBOutputService> mydbservice;
0070 if (!mydbservice.isAvailable()) {
0071 return;
0072 }
0073 auto& lumiBlock = evt.getLuminosityBlock();
0074 unsigned int irun = lumiBlock.getRun().run();
0075 unsigned int lumiId = lumiBlock.luminosityBlock();
0076 cond::Time_t currentLumi = cond::time::lumiTime(irun, lumiId);
0077 auto& rec = mydbservice->lookUpRecord(m_record);
0078 m_ret = -1;
0079 mydbservice->logger().start();
0080 mydbservice->logger().logDebug() << "Transaction id for time " << currentLumi << " : "
0081 << cond::time::transactionIdForLumiTime(currentLumi, rec.m_refreshTime, "");
0082 if (currentLumi != m_lastLumi) {
0083 m_nLumi++;
0084 std::ofstream lastLumiFile(m_lumiFile, std::ofstream::trunc);
0085 lastLumiFile << currentLumi;
0086 lastLumiFile.close();
0087 m_lastLumi = currentLumi;
0088 if (m_nLumi == 3) {
0089 std::string tag = mydbservice->tag(m_record);
0090 mydbservice->logger().logDebug() << "Tag: " << tag;
0091 BeamSpotObjects mybeamspot;
0092 mybeamspot.setPosition(0.053, 0.1, 0.13);
0093 mybeamspot.setSigmaZ(3.8);
0094 mybeamspot.setType(int(lumiId));
0095 mydbservice->logger().logDebug() << "BeamType: " << mybeamspot.beamType();
0096 try {
0097 auto iov = mydbservice->writeIOVForNextLumisection(mybeamspot, m_record);
0098 if (iov) {
0099 auto utime = cond::time::unpack(iov);
0100 mydbservice->logger().logDebug() << " Run: " << irun << " Lumi: " << lumiId << " IOV lumi: " << utime.second;
0101 m_ret = 0;
0102 }
0103 } catch (const std::exception& e) {
0104 mydbservice->logger().logError() << e.what();
0105 m_ret = 1;
0106 }
0107 m_nLumi = 0;
0108 } else {
0109 mydbservice->logger().logDebug() << "Skipping lumisection " << lumiId;
0110 }
0111 }
0112 mydbservice->logger().end(m_ret);
0113 }
0114
0115 DEFINE_FWK_MODULE(LumiBasedUpdateAnalyzer);