File indexing completed on 2024-04-06 12:05:03
0001 #include "DataFormats/Provenance/interface/FileIndex.h"
0002 #include "FWCore/Utilities/interface/Algorithms.h"
0003
0004 #include <algorithm>
0005 #include <iomanip>
0006 #include <ostream>
0007
0008 namespace edm {
0009
0010 FileIndex::FileIndex() : entries_(), transient_() {}
0011
0012
0013
0014
0015
0016
0017
0018
0019 FileIndex::Transients::Transients()
0020 : allInEntryOrder_(false), resultCached_(false), sortState_(kSorted_Run_Lumi_Event) {}
0021
0022 void FileIndex::Transients::reset() {
0023 allInEntryOrder_ = false;
0024 resultCached_ = false;
0025 sortState_ = kSorted_Run_Lumi_Event;
0026 }
0027
0028 void FileIndex::addEntry(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event, EntryNumber_t entry) {
0029 entries_.emplace_back(run, lumi, event, entry);
0030 resultCached() = false;
0031 sortState() = kNotSorted;
0032 }
0033
0034 void FileIndex::sortBy_Run_Lumi_Event() {
0035 stable_sort_all(entries_);
0036 resultCached() = false;
0037 sortState() = kSorted_Run_Lumi_Event;
0038 }
0039
0040 void FileIndex::sortBy_Run_Lumi_EventEntry() {
0041 stable_sort_all(entries_, Compare_Run_Lumi_EventEntry());
0042 resultCached() = false;
0043 sortState() = kSorted_Run_Lumi_EventEntry;
0044 }
0045
0046 bool FileIndex::allEventsInEntryOrder() const {
0047 if (!resultCached()) {
0048 resultCached() = true;
0049 EntryNumber_t maxEntry = Element::invalidEntry;
0050 for (std::vector<FileIndex::Element>::const_iterator it = entries_.begin(), itEnd = entries_.end(); it != itEnd;
0051 ++it) {
0052 if (it->getEntryType() == kEvent) {
0053 if (it->entry_ < maxEntry) {
0054 allInEntryOrder() = false;
0055 return false;
0056 }
0057 maxEntry = it->entry_;
0058 }
0059 }
0060 allInEntryOrder() = true;
0061 return true;
0062 }
0063 return allInEntryOrder();
0064 }
0065
0066 FileIndex::const_iterator FileIndex::findPosition(RunNumber_t run,
0067 LuminosityBlockNumber_t lumi,
0068 EventNumber_t event) const {
0069 assert(sortState() != kNotSorted);
0070
0071 const_iterator itEnd = entries_.end();
0072 const_iterator it;
0073 Element el(run, lumi, event);
0074 if (sortState() == kSorted_Run_Lumi_Event) {
0075 it = lower_bound_all(entries_, el);
0076 bool lumiMissing = (lumi == 0 && event != 0);
0077 if (lumiMissing) {
0078 while (it != itEnd && it->run_ < run) {
0079 ++it;
0080 }
0081 while (it != itEnd && (it->run_ == run && it->event_ < event)) {
0082 ++it;
0083 }
0084 }
0085 } else {
0086 it = lower_bound_all(entries_, el, Compare_Run_Lumi_EventEntry());
0087 }
0088 return it;
0089 }
0090
0091 FileIndex::const_iterator FileIndex::findEventPosition(RunNumber_t run,
0092 LuminosityBlockNumber_t lumi,
0093 EventNumber_t event) const {
0094 const_iterator it = findPosition(run, lumi, event);
0095 const_iterator itEnd = entries_.end();
0096 while (it != itEnd && it->getEntryType() != FileIndex::kEvent) {
0097 ++it;
0098 }
0099 if (it == itEnd) {
0100 return itEnd;
0101 }
0102 if (lumi == 0) {
0103 lumi = it->lumi_;
0104 }
0105 if (it->run_ != run || it->lumi_ != lumi || it->event_ != event) {
0106 if (sortState() == kSorted_Run_Lumi_Event) {
0107 return itEnd;
0108 }
0109
0110 while (it != itEnd && it->run_ == run && it->lumi_ == lumi && it->event_ != event) {
0111 ++it;
0112 }
0113 if (it->run_ != run || it->lumi_ != lumi || it->event_ != event) {
0114 return itEnd;
0115 }
0116 }
0117 return it;
0118 }
0119
0120 FileIndex::const_iterator FileIndex::findLumiPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const {
0121 const_iterator it = findPosition(run, lumi, 0U);
0122 const_iterator itEnd = entries_.end();
0123 while (it != itEnd && it->getEntryType() != FileIndex::kLumi) {
0124 ++it;
0125 }
0126 if (it == itEnd) {
0127 return itEnd;
0128 }
0129 if (it->run_ != run || it->lumi_ != lumi) {
0130 return itEnd;
0131 }
0132 return it;
0133 }
0134
0135 FileIndex::const_iterator FileIndex::findRunPosition(RunNumber_t run) const {
0136 const_iterator it = findPosition(run, 0U, 0U);
0137 const_iterator itEnd = entries_.end();
0138 while (it != itEnd && it->getEntryType() != FileIndex::kRun) {
0139 ++it;
0140 }
0141 if (it == itEnd) {
0142 return itEnd;
0143 }
0144 if (it->run_ != run) {
0145 return itEnd;
0146 }
0147 return it;
0148 }
0149
0150 FileIndex::const_iterator FileIndex::findLumiOrRunPosition(RunNumber_t run, LuminosityBlockNumber_t lumi) const {
0151 const_iterator it = findPosition(run, lumi, 0U);
0152 const_iterator itEnd = entries_.end();
0153 while (it != itEnd && it->getEntryType() != FileIndex::kLumi && it->getEntryType() != FileIndex::kRun) {
0154 ++it;
0155 }
0156 return it;
0157 }
0158
0159 FileIndex::const_iterator FileIndex::findEventEntryPosition(RunNumber_t run,
0160 LuminosityBlockNumber_t lumi,
0161 EventNumber_t event,
0162 EntryNumber_t entry) const {
0163 assert(sortState() != kNotSorted);
0164 const_iterator it;
0165 const_iterator itEnd = entries_.end();
0166 if (sortState() == kSorted_Run_Lumi_EventEntry) {
0167 assert(lumi != 0U);
0168 Element el(run, lumi, event, entry);
0169 it = lower_bound_all(entries_, el, Compare_Run_Lumi_EventEntry());
0170 } else {
0171 it = findEventPosition(run, lumi, event);
0172 while (it != itEnd && it->entry_ != entry && it->event_ == event) {
0173 ++it;
0174 }
0175 }
0176 if (it == itEnd)
0177 return itEnd;
0178 if (lumi == 0)
0179 lumi = it->lumi_;
0180 if (it->run_ != run || it->lumi_ != lumi || it->event_ != event || it->entry_ != entry)
0181 return itEnd;
0182 return it;
0183 }
0184
0185 bool operator<(FileIndex::Element const& lh, FileIndex::Element const& rh) {
0186 if (lh.run_ == rh.run_) {
0187 if (lh.lumi_ == rh.lumi_) {
0188 return lh.event_ < rh.event_;
0189 }
0190 return lh.lumi_ < rh.lumi_;
0191 }
0192 return lh.run_ < rh.run_;
0193 }
0194
0195 bool Compare_Run_Lumi_EventEntry::operator()(FileIndex::Element const& lh, FileIndex::Element const& rh) {
0196 if (lh.run_ == rh.run_) {
0197 if (lh.lumi_ == rh.lumi_) {
0198 if (lh.event_ == 0U && rh.event_ == 0U) {
0199 return false;
0200 } else if (lh.event_ == 0U) {
0201 return true;
0202 } else if (rh.event_ == 0U) {
0203 return false;
0204 } else {
0205 return lh.entry_ < rh.entry_;
0206 }
0207 }
0208 return lh.lumi_ < rh.lumi_;
0209 }
0210 return lh.run_ < rh.run_;
0211 }
0212
0213 std::ostream& operator<<(std::ostream& os, FileIndex const& fileIndex) {
0214 os << "\nPrinting FileIndex contents. This includes a list of all Runs, LuminosityBlocks\n"
0215 << "and Events stored in the root file.\n\n";
0216 os << std::setw(15) << "Run" << std::setw(15) << "Lumi" << std::setw(15) << "Event" << std::setw(15)
0217 << "TTree Entry"
0218 << "\n";
0219 for (std::vector<FileIndex::Element>::const_iterator it = fileIndex.begin(), itEnd = fileIndex.end(); it != itEnd;
0220 ++it) {
0221 if (it->getEntryType() == FileIndex::kEvent) {
0222 os << std::setw(15) << it->run_ << std::setw(15) << it->lumi_ << std::setw(15) << it->event_ << std::setw(15)
0223 << it->entry_ << "\n";
0224 } else if (it->getEntryType() == FileIndex::kLumi) {
0225 os << std::setw(15) << it->run_ << std::setw(15) << it->lumi_ << std::setw(15) << " " << std::setw(15)
0226 << it->entry_ << " (LuminosityBlock)"
0227 << "\n";
0228 } else if (it->getEntryType() == FileIndex::kRun) {
0229 os << std::setw(15) << it->run_ << std::setw(15) << " " << std::setw(15) << " " << std::setw(15) << it->entry_
0230 << " (Run)"
0231 << "\n";
0232 }
0233 }
0234 return os;
0235 }
0236 }