File indexing completed on 2024-04-06 12:13:10
0001
0002
0003
0004 #include <cerrno>
0005
0006 #include "DataFormats/Provenance/interface/LuminosityBlockAuxiliary.h"
0007 #include "DataFormats/Provenance/interface/RunAuxiliary.h"
0008 #include "DataFormats/Provenance/interface/ProductRegistry.h"
0009 #include "DataFormats/Provenance/interface/ProductResolverIndexHelper.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0012 #include "FWCore/Framework/interface/EventPrincipal.h"
0013 #include "FWCore/Framework/interface/LuminosityBlock.h"
0014 #include "FWCore/Framework/interface/Run.h"
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/ExceptionHelpers.h"
0017 #include "FWCore/Sources/interface/IDGeneratorSourceBase.h"
0018
0019 #include "FWCore/Sources/interface/PuttableSourceBase.h"
0020
0021 namespace {
0022 void checkFirstLumiForRuns(std::vector<edm::LuminosityBlockID> const& iFirstLumis) {
0023 if (iFirstLumis.empty())
0024 return;
0025
0026 auto previous = iFirstLumis[0].luminosityBlock();
0027 for (auto it = iFirstLumis.begin() + 1; it != iFirstLumis.end(); ++it) {
0028 if (not(it->luminosityBlock() > previous)) {
0029 throw edm::Exception(edm::errors::Configuration)
0030 << "Incorrect ordering of LuminosityBlock numbers in parameter 'firstLuminosityBlockForEachRun'";
0031 }
0032 }
0033 }
0034 }
0035 namespace edm {
0036
0037 static unsigned long long constexpr kNanoSecPerSec = 1000000000ULL;
0038 static unsigned long long constexpr kAveEventPerSec = 200ULL;
0039
0040 template <typename BASE>
0041 IDGeneratorSourceBase<BASE>::IDGeneratorSourceBase(ParameterSet const& pset,
0042 InputSourceDescription const& desc,
0043 bool realData)
0044 : BASE(pset, desc),
0045 firstLumiForRuns_(
0046 pset.getUntrackedParameter<std::vector<edm::LuminosityBlockID>>("firstLuminosityBlockForEachRun")),
0047 numberEventsInRun_(pset.getUntrackedParameter<unsigned int>("numberEventsInRun", BASE::remainingEvents())),
0048 numberEventsInLumi_(
0049 pset.getUntrackedParameter<unsigned int>("numberEventsInLuminosityBlock", BASE::remainingEvents())),
0050 presentTime_(pset.getUntrackedParameter<unsigned long long>("firstTime", 1ULL)),
0051 origTime_(presentTime_),
0052 timeBetweenEvents_(
0053 pset.getUntrackedParameter<unsigned long long>("timeBetweenEvents", kNanoSecPerSec / kAveEventPerSec)),
0054 eventCreationDelay_(pset.getUntrackedParameter<unsigned int>("eventCreationDelay", 0)),
0055 numberEventsInThisRun_(0),
0056 numberEventsInThisLumi_(0),
0057 zerothEvent_(pset.existsAs<unsigned int>("firstEvent", false)
0058 ? pset.getUntrackedParameter<unsigned int>("firstEvent", 1) - 1
0059 : pset.getUntrackedParameter<unsigned long long>("firstEvent", 1) - 1),
0060 eventID_(pset.getUntrackedParameter<unsigned int>("firstRun", 1),
0061 pset.getUntrackedParameter<unsigned int>("firstLuminosityBlock", 1),
0062 zerothEvent_),
0063 origEventID_(eventID_),
0064 isRealData_(realData),
0065 eType_(EventAuxiliary::Undefined) {
0066 BASE::setTimestamp(Timestamp(presentTime_));
0067 checkFirstLumiForRuns(firstLumiForRuns_);
0068 if (not firstLumiForRuns_.empty()) {
0069 numberEventsInRun_ = -1;
0070 eventID_ = EventID(runForLumi(eventID_.luminosityBlock()), eventID_.luminosityBlock(), zerothEvent_);
0071 }
0072 }
0073
0074 template <typename BASE>
0075 IDGeneratorSourceBase<BASE>::~IDGeneratorSourceBase() noexcept(false) {}
0076
0077 template <typename BASE>
0078 std::shared_ptr<RunAuxiliary> IDGeneratorSourceBase<BASE>::readRunAuxiliary_() {
0079 Timestamp ts = Timestamp(presentTime_);
0080 BASE::resetNewRun();
0081 return std::make_shared<RunAuxiliary>(eventID_.run(), ts, Timestamp::invalidTimestamp());
0082 }
0083
0084 template <typename BASE>
0085 std::shared_ptr<LuminosityBlockAuxiliary> IDGeneratorSourceBase<BASE>::readLuminosityBlockAuxiliary_() {
0086 if (BASE::processingMode() == BASE::Runs)
0087 return std::shared_ptr<LuminosityBlockAuxiliary>();
0088 Timestamp ts = Timestamp(presentTime_);
0089 BASE::resetNewLumi();
0090 return std::make_shared<LuminosityBlockAuxiliary>(
0091 eventID_.run(), eventID_.luminosityBlock(), ts, Timestamp::invalidTimestamp());
0092 }
0093
0094 template <typename BASE>
0095 void IDGeneratorSourceBase<BASE>::skip(int offset) {
0096 EventID oldEventID = eventID_;
0097 for (; offset < 0; ++offset) {
0098 retreatToPrevious(eventID_, presentTime_);
0099 }
0100 for (; offset > 0; --offset) {
0101 advanceToNext(eventID_, presentTime_);
0102 }
0103 if (eventID_.run() != oldEventID.run()) {
0104
0105 BASE::setNewRun();
0106 BASE::setNewLumi();
0107 }
0108 if (eventID_.luminosityBlock() != oldEventID.luminosityBlock()) {
0109
0110 BASE::setNewLumi();
0111 }
0112 }
0113
0114 template <typename BASE>
0115 void IDGeneratorSourceBase<BASE>::beginJob() {
0116 BASE::beginJob();
0117
0118
0119 initialize(eventID_, presentTime_, timeBetweenEvents_);
0120 }
0121
0122 template <typename BASE>
0123 void IDGeneratorSourceBase<BASE>::initialize(EventID&, TimeValue_t&, TimeValue_t&) {}
0124
0125 template <typename BASE>
0126 void IDGeneratorSourceBase<BASE>::rewind_() {
0127 presentTime_ = origTime_;
0128 eventID_ = origEventID_;
0129 numberEventsInThisRun_ = 0;
0130 numberEventsInThisLumi_ = 0;
0131 BASE::setNewRun();
0132 BASE::setNewLumi();
0133 }
0134
0135 template <typename BASE>
0136 typename BASE::ItemTypeInfo IDGeneratorSourceBase<BASE>::getNextItemType() {
0137 if (BASE::state() == BASE::ItemType::IsInvalid) {
0138 return noFiles() ? BASE::ItemType::IsStop : BASE::ItemType::IsFile;
0139 }
0140 if (BASE::newRun()) {
0141 return BASE::ItemType::IsRun;
0142 }
0143 if (BASE::newLumi()) {
0144 return BASE::ItemType::IsLumi;
0145 }
0146 if (BASE::eventCached()) {
0147 return BASE::ItemType::IsEvent;
0148 }
0149 EventID oldEventID = eventID_;
0150 advanceToNext(eventID_, presentTime_);
0151 if (eventCreationDelay_ > 0) {
0152 usleep(eventCreationDelay_);
0153 }
0154 size_t index = fileIndex();
0155 bool another = setRunAndEventInfo(eventID_, presentTime_, eType_);
0156 if (!another) {
0157 return BASE::ItemType::IsStop;
0158 }
0159 bool newFile = (fileIndex() > index);
0160 BASE::setEventCached();
0161 if (BASE::newRun() || eventID_.run() != oldEventID.run()) {
0162
0163 BASE::setNewRun();
0164 BASE::setNewLumi();
0165 return newFile ? BASE::ItemType::IsFile : BASE::ItemType::IsRun;
0166 }
0167
0168 if (BASE::newLumi() || eventID_.luminosityBlock() != oldEventID.luminosityBlock()) {
0169
0170 BASE::setNewLumi();
0171 return newFile ? BASE::ItemType::IsFile : BASE::ItemType::IsLumi;
0172 }
0173 return newFile ? BASE::ItemType::IsFile : BASE::ItemType::IsEvent;
0174 }
0175
0176 template <typename BASE>
0177 void IDGeneratorSourceBase<BASE>::advanceToNext(EventID& eventID, TimeValue_t& time) {
0178 if (numberEventsInRun_ < 1 || numberEventsInThisRun_ < numberEventsInRun_) {
0179
0180 ++numberEventsInThisRun_;
0181 if (!(numberEventsInLumi_ < 1 || numberEventsInThisLumi_ < numberEventsInLumi_)) {
0182
0183 eventID = eventID.next(eventID.luminosityBlock() + 1);
0184 numberEventsInThisLumi_ = 1;
0185 if (not firstLumiForRuns_.empty()) {
0186 auto run = runForLumi(eventID.luminosityBlock());
0187 if (run != eventID.run()) {
0188 numberEventsInThisRun_ = 1;
0189 eventID = eventID.nextRunFirstEvent(eventID_.luminosityBlock());
0190
0191 eventID = EventID(run, eventID.luminosityBlock(), eventID.event());
0192 }
0193 }
0194 } else {
0195 eventID = eventID.next(eventID.luminosityBlock());
0196 ++numberEventsInThisLumi_;
0197 }
0198 } else {
0199
0200 eventID = eventID.nextRunFirstEvent(origEventID_.luminosityBlock());
0201 numberEventsInThisLumi_ = 1;
0202 numberEventsInThisRun_ = 1;
0203 }
0204 time += timeBetweenEvents_;
0205 }
0206
0207 template <typename BASE>
0208 void IDGeneratorSourceBase<BASE>::retreatToPrevious(EventID& eventID, TimeValue_t& time) {
0209 if (numberEventsInRun_ < 1 || numberEventsInThisRun_ > 0) {
0210
0211 --numberEventsInThisRun_;
0212 eventID = eventID.previous(eventID.luminosityBlock());
0213 if (!(numberEventsInLumi_ < 1 || numberEventsInThisLumi_ > 0)) {
0214
0215 eventID = eventID.previous(eventID.luminosityBlock() - 1);
0216 numberEventsInThisLumi_ = numberEventsInLumi_;
0217
0218 if (not firstLumiForRuns_.empty()) {
0219 auto run = runForLumi(eventID.luminosityBlock());
0220 if (run != eventID.run()) {
0221 eventID = eventID.previousRunLastEvent(eventID_.luminosityBlock());
0222
0223 eventID = EventID(run, eventID.luminosityBlock(), eventID.event());
0224 }
0225 }
0226 } else {
0227 --numberEventsInThisLumi_;
0228 }
0229 } else {
0230
0231 assert(numberEventsInLumi_ != 0);
0232 eventID = eventID.previousRunLastEvent(origEventID_.luminosityBlock() + numberEventsInRun_ / numberEventsInLumi_);
0233 eventID = EventID(numberEventsInRun_, eventID.luminosityBlock(), eventID.run());
0234 numberEventsInThisLumi_ = numberEventsInLumi_;
0235 numberEventsInThisRun_ = numberEventsInRun_;
0236 }
0237 time -= timeBetweenEvents_;
0238 }
0239
0240 template <typename BASE>
0241 RunNumber_t IDGeneratorSourceBase<BASE>::runForLumi(LuminosityBlockNumber_t iLumi) const {
0242 auto it = std::find_if(firstLumiForRuns_.rbegin(), firstLumiForRuns_.rend(), [iLumi](auto const& iV) {
0243 return iV.luminosityBlock() <= iLumi;
0244 });
0245 if (it == firstLumiForRuns_.rend()) {
0246
0247 return firstLumiForRuns_[0].run();
0248 }
0249 return it->run();
0250 }
0251
0252 template <typename BASE>
0253 bool IDGeneratorSourceBase<BASE>::noFiles() const {
0254 return false;
0255 }
0256
0257 template <typename BASE>
0258 size_t IDGeneratorSourceBase<BASE>::fileIndex() const {
0259 return 0UL;
0260 }
0261
0262 template <typename BASE>
0263 void IDGeneratorSourceBase<BASE>::fillDescription(ParameterSetDescription& desc) {
0264 desc.addOptionalUntracked<unsigned int>("numberEventsInRun")
0265 ->setComment("Number of events to generate in each run.");
0266 desc.addOptionalUntracked<unsigned int>("numberEventsInLuminosityBlock")
0267 ->setComment("Number of events to generate in each lumi.");
0268 desc.addUntracked<unsigned long long>("firstTime", 1)->setComment("Time before first event (ns) (for timestamp).");
0269 desc.addUntracked<unsigned long long>("timeBetweenEvents", kNanoSecPerSec / kAveEventPerSec)
0270 ->setComment("Time between consecutive events (ns) (for timestamp).");
0271 desc.addUntracked<unsigned int>("eventCreationDelay", 0)
0272 ->setComment("Real time delay between generation of consecutive events (ms).");
0273
0274 desc.addNode(edm::ParameterDescription<unsigned int>("firstEvent", 1U, false) xor
0275 edm::ParameterDescription<unsigned long long>("firstEvent", 1ULL, false))
0276 ->setComment(
0277 "'firstEvent' is an XOR group because it can have type uint32 or uint64, default:1\n"
0278 "Event number of first event to generate.");
0279
0280 desc.addUntracked<unsigned int>("firstLuminosityBlock", 1)
0281 ->setComment("Luminosity block number of first lumi to generate.");
0282 desc.addUntracked<unsigned int>("firstRun", 1)->setComment("Run number of first run to generate.");
0283 desc.addUntracked<std::vector<edm::LuminosityBlockID>>("firstLuminosityBlockForEachRun", {})
0284 ->setComment(
0285 "When the source makes a new LuminosityBlock, this list is checked to see what Run number should be used. "
0286 "The LuminosityBlock numbers are required to be in ascending order.");
0287 BASE::fillDescription(desc);
0288 }
0289
0290 template class IDGeneratorSourceBase<PuttableSourceBase>;
0291 template class IDGeneratorSourceBase<InputSource>;
0292 }