File indexing completed on 2024-09-07 04:35:19
0001 #ifndef CommonTools_ConditionDBWriter_ConditionDBWriter_h
0002 #define CommonTools_ConditionDBWriter_ConditionDBWriter_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 #include <memory>
0128 #include <string>
0129 #include <cstdlib>
0130
0131
0132 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0133 #include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
0134 #include "DataFormats/Common/interface/Handle.h"
0135 #include "FWCore/Framework/interface/ESHandle.h"
0136 #include "FWCore/Framework/interface/Event.h"
0137 #include "FWCore/Framework/interface/Frameworkfwd.h"
0138 #include "FWCore/Framework/interface/Run.h"
0139 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0140 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0141 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0142 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0143 #include "FWCore/ServiceRegistry/interface/Service.h"
0144 #include "FWCore/Utilities/interface/Exception.h"
0145
0146 template <class T>
0147 class ConditionDBWriter
0148 : public edm::one::EDAnalyzer<edm::one::WatchRuns, edm::one::WatchLuminosityBlocks, edm::one::SharedResources> {
0149 public:
0150 explicit ConditionDBWriter(const edm::ParameterSet &iConfig)
0151 : minRunRange_(1 << 31),
0152 maxRunRange_(0),
0153 LumiBlockMode_(false),
0154 RunMode_(false),
0155 JobMode_(false),
0156 AlgoDrivenMode_(false),
0157 Time_(0),
0158 setSinceTime_(false),
0159 firstRun_(true) {
0160 usesResource(cond::service::PoolDBOutputService::kSharedResource);
0161 edm::LogInfo("ConditionDBWriter") << "ConditionDBWriter()";
0162 SinceAppendMode_ = iConfig.getParameter<bool>("SinceAppendMode");
0163 std::string IOVMode = iConfig.getParameter<std::string>("IOVMode");
0164 if (IOVMode == std::string("Job"))
0165 JobMode_ = true;
0166 else if (IOVMode == std::string("Run"))
0167 RunMode_ = true;
0168 else if (IOVMode == std::string("LumiBlock"))
0169 LumiBlockMode_ = true;
0170 else if (IOVMode == std::string("AlgoDriven"))
0171 AlgoDrivenMode_ = true;
0172 else
0173 edm::LogError("ConditionDBWriter")
0174 << "ConditionDBWriter(): ERROR - unknown IOV interval write mode...will not store anything "
0175 "on the DB";
0176 Record_ = iConfig.getParameter<std::string>("Record");
0177 doStore_ = iConfig.getParameter<bool>("doStoreOnDB");
0178 timeFromEndRun_ = iConfig.getUntrackedParameter<bool>("TimeFromEndRun", false);
0179 timeFromStartOfRunRange_ = iConfig.getUntrackedParameter<bool>("TimeFromStartOfRunRange", false);
0180
0181 if (!SinceAppendMode_)
0182 edm::LogError("ConditionDBWriter") << "endJob(): ERROR - only SinceAppendMode support!!!!";
0183 }
0184
0185 ~ConditionDBWriter() override { edm::LogInfo("ConditionDBWriter") << "~ConditionDBWriter()"; }
0186
0187
0188 static void fillPSetDescription(edm::ParameterSetDescription &desc) {
0189 desc.add<bool>("SinceAppendMode");
0190 desc.add<std::string>("IOVMode");
0191 desc.add<std::string>("Record");
0192 desc.add<bool>("doStoreOnDB");
0193 desc.addUntracked<bool>("TimeFromEndRun", false);
0194 desc.addUntracked<bool>("TimeFromStartOfRunRange", false);
0195 }
0196
0197 private:
0198
0199
0200 virtual std::unique_ptr<T> getNewObject() = 0;
0201
0202
0203
0204
0205 virtual void algoBeginJob(const edm::EventSetup &) {}
0206
0207 virtual void algoBeginRun(const edm::Run &, const edm::EventSetup &) {}
0208
0209 virtual void algoBeginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) {}
0210
0211 virtual void algoAnalyze(const edm::Event &, const edm::EventSetup &) {}
0212
0213 virtual void algoEndRun(const edm::Run &, const edm::EventSetup &) {}
0214
0215 virtual void algoEndJob() {}
0216
0217 void beginJob() override {}
0218
0219 void beginRun(const edm::Run &run, const edm::EventSetup &es) override {
0220 if (firstRun_) {
0221 edm::LogInfo("ConditionDBWriter") << "beginJob";
0222 if ((JobMode_ || AlgoDrivenMode_) && SinceAppendMode_)
0223 setSinceTime_ = true;
0224 algoBeginJob(es);
0225 firstRun_ = false;
0226 }
0227
0228 if (run.id().run() < minRunRange_)
0229 minRunRange_ = run.id().run();
0230 if (run.id().run() > maxRunRange_)
0231 maxRunRange_ = run.id().run();
0232
0233 edm::LogInfo("ConditionDBWriter") << "beginRun";
0234 if (RunMode_ && SinceAppendMode_)
0235 setSinceTime_ = true;
0236 algoBeginRun(run, es);
0237 }
0238
0239 void beginLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &iSetup) override {
0240 edm::LogInfo("ConditionDBWriter") << "beginLuminosityBlock";
0241 if (LumiBlockMode_ && SinceAppendMode_)
0242 setSinceTime_ = true;
0243 algoBeginLuminosityBlock(lumiBlock, iSetup);
0244 }
0245
0246 void analyze(const edm::Event &event, const edm::EventSetup &iSetup) override {
0247 if (setSinceTime_) {
0248 setTime();
0249 setSinceTime_ = false;
0250 }
0251 algoAnalyze(event, iSetup);
0252 }
0253
0254 void endLuminosityBlock(const edm::LuminosityBlock &lumiBlock, const edm::EventSetup &es) override {
0255 edm::LogInfo("ConditionDBWriter") << "endLuminosityBlock";
0256 algoEndLuminosityBlock(lumiBlock, es);
0257
0258 if (LumiBlockMode_) {
0259 std::unique_ptr<T> objPointer = getNewObject();
0260
0261 if (objPointer) {
0262 storeOnDb(objPointer);
0263 } else {
0264 edm::LogError("ConditionDBWriter")
0265 << "endLuminosityblock(): ERROR - requested to store on DB on a Lumi Block based interval, "
0266 "but received null pointer...will not store anything on the DB";
0267 }
0268 }
0269 }
0270
0271 virtual void algoEndLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) {}
0272
0273 void endRun(const edm::Run &run, const edm::EventSetup &es) override {
0274 edm::LogInfo("ConditionDBWriter") << "endRun";
0275
0276 algoEndRun(run, es);
0277
0278 if (RunMode_) {
0279 std::unique_ptr<T> objPointer = getNewObject();
0280
0281 if (objPointer) {
0282 if (timeFromEndRun_)
0283 Time_ = run.id().run();
0284 storeOnDb(objPointer);
0285 } else {
0286 edm::LogError("ConditionDBWriter")
0287 << "endRun(): ERROR - requested to store on DB on a Run based interval, but received null "
0288 "pointer...will not store anything on the DB";
0289 }
0290 }
0291 }
0292
0293 void endJob() override {
0294 edm::LogInfo("ConditionDBWriter") << "endJob";
0295
0296 algoEndJob();
0297
0298 if (JobMode_) {
0299 std::unique_ptr<T> objPointer = getNewObject();
0300
0301 if (objPointer) {
0302 storeOnDb(objPointer);
0303 }
0304
0305 else {
0306 edm::LogError("ConditionDBWriter") << "endJob() : ERROR - requested to store on DB on a Job based interval, "
0307 "but received null pointer...will not store anything on the DB";
0308 }
0309 }
0310 }
0311
0312 void storeOnDb(std::unique_ptr<T> &objPointer) {
0313 edm::LogInfo("ConditionDBWriter)") << "storeOnDb ";
0314
0315 setSinceTime_ = true;
0316
0317 if (!objPointer) {
0318 edm::LogError("ConditionDBWriter: Pointer to object has not been set...storing no data on DB");
0319 return;
0320 }
0321
0322
0323 if (!doStore_)
0324 return;
0325 edm::Service<cond::service::PoolDBOutputService> mydbservice;
0326 if (!mydbservice.isAvailable()) {
0327 edm::LogError("ConditionDBWriter") << "PoolDBOutputService is unavailable";
0328 return;
0329 }
0330
0331 cond::Time_t since =
0332 (mydbservice->isNewTagRequest(Record_) && !timeFromEndRun_) ? mydbservice->beginOfTime() : Time_;
0333
0334
0335 if (timeFromStartOfRunRange_)
0336 since = minRunRange_;
0337
0338 edm::LogInfo("ConditionDBWriter") << "appending a new object to tag " << Record_ << " in since mode ";
0339
0340 mydbservice->writeOneIOV<T>(*objPointer, since, Record_);
0341 }
0342
0343 void setTime() {
0344 edm::Service<cond::service::PoolDBOutputService> mydbservice;
0345
0346 if (mydbservice.isAvailable()) {
0347 Time_ = mydbservice->currentTime();
0348 edm::LogInfo("ConditionDBWriter") << "setTime: time set to " << Time_;
0349 } else {
0350 edm::LogError("ConditionDBWriter") << "setTime(): PoolDBOutputService is not available...cannot set current time";
0351 }
0352 }
0353
0354 protected:
0355
0356
0357 void storeOnDbNow() {
0358 if (AlgoDrivenMode_) {
0359 setSinceTime_ = true;
0360
0361 std::unique_ptr<T> objPointer = getNewObject();
0362
0363 if (!objPointer) {
0364 edm::LogError("ConditionDBWriter")
0365 << "storeOnDbNow: ERROR - requested to store on DB a new object (module configuration is "
0366 "algo driven based IOV), but received NULL pointer...will not store anything on the DB";
0367 return;
0368 } else {
0369 storeOnDb(objPointer);
0370 }
0371
0372 } else {
0373 edm::LogError("ConditionDBWriter")
0374 << "storeOnDbNow(): ERROR - received a direct request from concrete algorithm to store on DB "
0375 "a new object, but module configuration is not to store on DB on an algo driven based interval...will not "
0376 "store anything on the DB";
0377 return;
0378 }
0379 }
0380
0381
0382
0383 cond::Time_t timeOfLastIOV() { return Time_; }
0384
0385
0386 void setDoStore(const bool doStore) { doStore_ = doStore; }
0387
0388 private:
0389 unsigned int minRunRange_;
0390 unsigned int maxRunRange_;
0391
0392 bool SinceAppendMode_;
0393
0394 bool LumiBlockMode_;
0395 bool RunMode_;
0396 bool JobMode_;
0397 bool AlgoDrivenMode_;
0398 bool doStore_;
0399
0400 std::string Record_;
0401
0402 cond::Time_t Time_;
0403
0404 bool setSinceTime_;
0405
0406 bool firstRun_;
0407
0408 bool timeFromEndRun_;
0409 bool timeFromStartOfRunRange_;
0410 };
0411
0412 #endif