00001 #ifndef DataFormats_Provenance_LuminosityBlockID_h
00002 #define DataFormats_Provenance_LuminosityBlockID_h
00003
00004
00005
00006
00007
00016
00017
00018
00019
00020
00021 #include <functional>
00022 #include <iosfwd>
00023
00024
00025 #include "DataFormats/Provenance/interface/RunID.h"
00026
00027
00028 namespace edm {
00029
00030 typedef unsigned int LuminosityBlockNumber_t;
00031
00032
00033 class LuminosityBlockID
00034 {
00035
00036 public:
00037
00038
00039 LuminosityBlockID() : run_(0), luminosityBlock_(0) {}
00040 LuminosityBlockID(RunNumber_t iRun, LuminosityBlockNumber_t iLuminosityBlock) :
00041 run_(iRun), luminosityBlock_(iLuminosityBlock) {}
00042
00043
00044
00045
00046 RunNumber_t run() const { return run_; }
00047 LuminosityBlockNumber_t luminosityBlock() const { return luminosityBlock_; }
00048
00049
00050 LuminosityBlockID next() const {
00051 if(luminosityBlock_ != maxLuminosityBlockNumber()) {
00052 return LuminosityBlockID(run_, luminosityBlock_+1);
00053 }
00054 return LuminosityBlockID(run_+1, 1);
00055 }
00056 LuminosityBlockID nextRun() const {
00057 return LuminosityBlockID(run_+1, 0);
00058 }
00059 LuminosityBlockID nextRunFirstLuminosityBlock() const {
00060 return LuminosityBlockID(run_+1, 1);
00061 }
00062 LuminosityBlockID previousRunLastLuminosityBlock() const {
00063 if(run_ > 1) {
00064 return LuminosityBlockID(run_-1, maxLuminosityBlockNumber());
00065 }
00066 return LuminosityBlockID(0,0);
00067 }
00068
00069 LuminosityBlockID previous() const {
00070 if(luminosityBlock_ > 1) {
00071 return LuminosityBlockID(run_, luminosityBlock_-1);
00072 }
00073 if(run_ != 0) {
00074 return LuminosityBlockID(run_ -1, maxLuminosityBlockNumber());
00075 }
00076 return LuminosityBlockID(0,0);
00077 }
00078
00079 bool operator==(LuminosityBlockID const& iRHS) const {
00080 return iRHS.run_ == run_ && iRHS.luminosityBlock_ == luminosityBlock_;
00081 }
00082 bool operator!=(LuminosityBlockID const& iRHS) const {
00083 return ! (*this == iRHS);
00084 }
00085
00086 bool operator<(LuminosityBlockID const& iRHS) const {
00087 return doOp<std::less>(iRHS);
00088 }
00089 bool operator<=(LuminosityBlockID const& iRHS) const {
00090 return doOp<std::less_equal>(iRHS);
00091 }
00092 bool operator>(LuminosityBlockID const& iRHS) const {
00093 return doOp<std::greater>(iRHS);
00094 }
00095 bool operator>=(LuminosityBlockID const& iRHS) const {
00096 return doOp<std::greater_equal>(iRHS);
00097 }
00098
00099
00100 static LuminosityBlockNumber_t maxLuminosityBlockNumber() {
00101 return 0xFFFFFFFFU;
00102 }
00103
00104 static LuminosityBlockID firstValidLuminosityBlock() {
00105 return LuminosityBlockID(1, 1);
00106 }
00107
00108
00109 private:
00110 template<template <typename> class Op>
00111 bool doOp(LuminosityBlockID const& iRHS) const {
00112
00113 if(run_ == iRHS.run_) {
00114 Op<LuminosityBlockNumber_t> op_e;
00115 return op_e(luminosityBlock_, iRHS.luminosityBlock_);
00116 }
00117 Op<RunNumber_t> op;
00118 return op(run_, iRHS.run_) ;
00119 }
00120
00121
00122
00123
00124
00125 RunNumber_t run_;
00126 LuminosityBlockNumber_t luminosityBlock_;
00127 };
00128
00129 std::ostream& operator<<(std::ostream& oStream, LuminosityBlockID const& iID);
00130
00131 }
00132 #endif