File indexing completed on 2023-03-17 10:51:06
0001 #ifndef DataFormats_Provenance_LuminosityBlockID_h
0002 #define DataFormats_Provenance_LuminosityBlockID_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <functional>
0015 #include <iosfwd>
0016
0017 #include "DataFormats/Provenance/interface/RunID.h"
0018 #include "DataFormats/Provenance/interface/RunLumiEventNumber.h"
0019 #include <cstdint>
0020
0021 namespace edm {
0022
0023 class LuminosityBlockID {
0024 public:
0025 LuminosityBlockID() : run_(invalidRunNumber), luminosityBlock_(invalidLuminosityBlockNumber) {}
0026 explicit LuminosityBlockID(uint64_t id);
0027 LuminosityBlockID(RunNumber_t iRun, LuminosityBlockNumber_t iLuminosityBlock)
0028 : run_(iRun), luminosityBlock_(iLuminosityBlock) {}
0029
0030
0031 RunNumber_t run() const { return run_; }
0032 LuminosityBlockNumber_t luminosityBlock() const { return luminosityBlock_; }
0033
0034 uint64_t value() const;
0035
0036
0037 LuminosityBlockID next() const {
0038 if (luminosityBlock_ != maxLuminosityBlockNumber()) {
0039 return LuminosityBlockID(run_, luminosityBlock_ + 1);
0040 }
0041 return LuminosityBlockID(run_ + 1, 1);
0042 }
0043 LuminosityBlockID nextRun() const { return LuminosityBlockID(run_ + 1, 0); }
0044 LuminosityBlockID nextRunFirstLuminosityBlock() const { return LuminosityBlockID(run_ + 1, 1); }
0045 LuminosityBlockID previousRunLastLuminosityBlock() const {
0046 if (run_ > 1) {
0047 return LuminosityBlockID(run_ - 1, maxLuminosityBlockNumber());
0048 }
0049 return LuminosityBlockID(0, 0);
0050 }
0051
0052 LuminosityBlockID previous() const {
0053 if (luminosityBlock_ > 1) {
0054 return LuminosityBlockID(run_, luminosityBlock_ - 1);
0055 }
0056 if (run_ != 0) {
0057 return LuminosityBlockID(run_ - 1, maxLuminosityBlockNumber());
0058 }
0059 return LuminosityBlockID(0, 0);
0060 }
0061
0062 bool operator==(LuminosityBlockID const& iRHS) const {
0063 return iRHS.run_ == run_ && iRHS.luminosityBlock_ == luminosityBlock_;
0064 }
0065 bool operator!=(LuminosityBlockID const& iRHS) const { return !(*this == iRHS); }
0066
0067 bool operator<(LuminosityBlockID const& iRHS) const { return doOp<std::less>(iRHS); }
0068 bool operator<=(LuminosityBlockID const& iRHS) const { return doOp<std::less_equal>(iRHS); }
0069 bool operator>(LuminosityBlockID const& iRHS) const { return doOp<std::greater>(iRHS); }
0070 bool operator>=(LuminosityBlockID const& iRHS) const { return doOp<std::greater_equal>(iRHS); }
0071
0072
0073
0074 static LuminosityBlockNumber_t maxLuminosityBlockNumber() { return 0xFFFFFFFFU; }
0075
0076 static LuminosityBlockID firstValidLuminosityBlock() { return LuminosityBlockID(1, 1); }
0077
0078 private:
0079 template <template <typename> class Op>
0080 bool doOp(LuminosityBlockID const& iRHS) const {
0081
0082 if (run_ == iRHS.run_) {
0083 Op<LuminosityBlockNumber_t> op_e;
0084 return op_e(luminosityBlock_, iRHS.luminosityBlock_);
0085 }
0086 Op<RunNumber_t> op;
0087 return op(run_, iRHS.run_);
0088 }
0089
0090
0091 RunNumber_t run_;
0092 LuminosityBlockNumber_t luminosityBlock_;
0093 };
0094
0095 std::ostream& operator<<(std::ostream& oStream, LuminosityBlockID const& iID);
0096
0097 inline LuminosityBlockID const& min(LuminosityBlockID const& lh, LuminosityBlockID const& rh) {
0098 return (rh < lh ? rh : lh);
0099 }
0100
0101 inline LuminosityBlockID const& max(LuminosityBlockID const& lh, LuminosityBlockID const& rh) {
0102 return (rh < lh ? lh : rh);
0103 }
0104
0105 }
0106 #endif