File indexing completed on 2024-04-06 12:11:55
0001 #include "FWCore/Common/interface/OutputProcessBlockHelper.h"
0002
0003 #include "DataFormats/Provenance/interface/StoredProcessBlockHelper.h"
0004 #include "FWCore/Common/interface/ProcessBlockHelperBase.h"
0005
0006 #include <algorithm>
0007 #include <cassert>
0008 #include <utility>
0009
0010 namespace edm {
0011
0012 void OutputProcessBlockHelper::updateAfterProductSelection(
0013 std::set<std::string> const& processesWithKeptProcessBlockProducts,
0014 ProcessBlockHelperBase const& processBlockHelper) {
0015 processBlockHelper_ = &processBlockHelper;
0016
0017
0018
0019
0020
0021 assert(processesWithProcessBlockProducts_.empty());
0022 unsigned int iProcess = 0;
0023 for (auto const& process : processBlockHelper.processesWithProcessBlockProducts()) {
0024 if (processesWithKeptProcessBlockProducts.find(process) != processesWithKeptProcessBlockProducts.end()) {
0025 processesWithProcessBlockProducts_.emplace_back(process);
0026 translateFromStoredIndex_.emplace_back(iProcess);
0027 }
0028 ++iProcess;
0029 }
0030
0031 for (auto const& addedProcess : processBlockHelper.addedProcesses()) {
0032
0033
0034
0035 if (std::find(processesWithProcessBlockProducts_.begin(),
0036 processesWithProcessBlockProducts_.end(),
0037 addedProcess) != processesWithProcessBlockProducts_.end()) {
0038 ++nAddedProcesses_;
0039 }
0040 }
0041
0042
0043
0044
0045
0046 productsFromInputKept_ =
0047 std::find_first_of(processesWithProcessBlockProducts_.begin(),
0048 processesWithProcessBlockProducts_.end(),
0049 processBlockHelper.topProcessesWithProcessBlockProducts().begin(),
0050 processBlockHelper.topProcessesWithProcessBlockProducts().begin() +
0051 processBlockHelper.nProcessesInFirstFile()) != processesWithProcessBlockProducts_.end();
0052 }
0053
0054 void OutputProcessBlockHelper::fillCacheIndices(StoredProcessBlockHelper& storedProcessBlockHelper) const {
0055
0056
0057
0058 std::vector<unsigned int> storedCacheIndices;
0059
0060
0061 unsigned int nStoredProcesses = storedProcessBlockHelper.processesWithProcessBlockProducts().size();
0062
0063 if (!productsFromInputKept_) {
0064
0065
0066
0067 assert(nAddedProcesses_ == nStoredProcesses);
0068 storedCacheIndices.reserve(nStoredProcesses);
0069 for (unsigned int i = 0; i < nStoredProcesses; ++i) {
0070 storedCacheIndices.push_back(i);
0071 }
0072 storedProcessBlockHelper.setProcessBlockCacheIndices(std::move(storedCacheIndices));
0073 return;
0074 }
0075
0076
0077
0078 std::vector<std::vector<unsigned int>> const& cacheIndices = processBlockHelper_->processBlockCacheIndices();
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092 std::vector<unsigned int> const& cacheIndexVectorsPerFile = processBlockHelper_->cacheIndexVectorsPerFile();
0093 std::vector<unsigned int> const& cacheEntriesPerFile = processBlockHelper_->cacheEntriesPerFile();
0094 std::vector<std::vector<unsigned int>> const& nEntries = processBlockHelper_->nEntries();
0095
0096 assert(!cacheIndices.empty());
0097
0098 unsigned int nInputProcesses = 0;
0099 for (unsigned int iStoredProcess = 0; iStoredProcess < nStoredProcesses; ++iStoredProcess) {
0100
0101
0102
0103
0104
0105 if (translateFromStoredIndex_[iStoredProcess] < cacheIndices[0].size()) {
0106 ++nInputProcesses;
0107 }
0108 }
0109
0110
0111
0112
0113
0114
0115 unsigned int fileOffset = 0;
0116
0117
0118
0119 std::vector<unsigned int> processOffset(nInputProcesses, 0);
0120
0121
0122
0123
0124
0125
0126 assert(!nEntries.empty());
0127 std::vector<unsigned int> storedProcessOffset(nInputProcesses + 1, 0);
0128
0129
0130
0131
0132 std::vector<unsigned int> storedFileInProcessOffset(nInputProcesses, 0);
0133
0134 setStoredProcessOffset(nInputProcesses, nEntries, storedProcessOffset);
0135
0136 storedCacheIndices.reserve(cacheIndices.size() * nStoredProcesses);
0137
0138 unsigned int iFile = 0;
0139 unsigned int innerVectorsCurrentFile = 0;
0140
0141
0142
0143 for (auto const& innerVectorOfCacheIndices : cacheIndices) {
0144
0145
0146
0147
0148
0149 while (innerVectorsCurrentFile == cacheIndexVectorsPerFile[iFile]) {
0150
0151
0152 fileOffset += cacheEntriesPerFile[iFile];
0153 ++iFile;
0154 innerVectorsCurrentFile = 0;
0155 }
0156 if (innerVectorsCurrentFile == 0) {
0157
0158 setProcessOffset(iFile, nInputProcesses, nEntries, processOffset);
0159 setStoredFileInProcessOffset(iFile, nInputProcesses, nEntries, storedFileInProcessOffset);
0160 }
0161 ++innerVectorsCurrentFile;
0162
0163 assert(nInputProcesses + nAddedProcesses_ == nStoredProcesses);
0164
0165
0166 for (unsigned int iStoredProcess = 0; iStoredProcess < nStoredProcesses; ++iStoredProcess) {
0167 unsigned int storedCacheIndex = ProcessBlockHelperBase::invalidCacheIndex();
0168 if (iStoredProcess < nInputProcesses) {
0169 unsigned int cacheIndex = innerVectorOfCacheIndices[translateFromStoredIndex_[iStoredProcess]];
0170 if (cacheIndex != ProcessBlockHelperBase::invalidCacheIndex()) {
0171
0172
0173 unsigned int inputOffset = fileOffset + processOffset[iStoredProcess];
0174 unsigned int storedOffset = storedProcessOffset[iStoredProcess] + storedFileInProcessOffset[iStoredProcess];
0175 storedCacheIndex = cacheIndex - inputOffset + storedOffset;
0176 }
0177 } else {
0178
0179
0180 storedCacheIndex = storedProcessOffset[nInputProcesses] + iStoredProcess - nInputProcesses;
0181 }
0182 storedCacheIndices.push_back(storedCacheIndex);
0183 }
0184 }
0185 storedProcessBlockHelper.setProcessBlockCacheIndices(std::move(storedCacheIndices));
0186 }
0187
0188 void OutputProcessBlockHelper::setStoredProcessOffset(unsigned int nInputProcesses,
0189 std::vector<std::vector<unsigned int>> const& nEntries,
0190 std::vector<unsigned int>& storedProcessOffset) const {
0191 unsigned int iStored = 0;
0192 for (auto& offset : storedProcessOffset) {
0193 offset = 0;
0194
0195 for (unsigned int jStored = 0; jStored < iStored; ++jStored) {
0196 unsigned int indexInEventProcessor = translateFromStoredIndex_[jStored];
0197
0198 for (auto const& entries : nEntries) {
0199 assert(indexInEventProcessor < entries.size());
0200 offset += entries[indexInEventProcessor];
0201 }
0202 }
0203 ++iStored;
0204 }
0205 }
0206
0207 void OutputProcessBlockHelper::setProcessOffset(unsigned int iFile,
0208 unsigned int nInputProcesses,
0209 std::vector<std::vector<unsigned int>> const& nEntries,
0210 std::vector<unsigned int>& processOffset) const {
0211 unsigned int iStored = 0;
0212 for (auto& offset : processOffset) {
0213 offset = 0;
0214 unsigned int iProcess = translateFromStoredIndex_[iStored];
0215 for (unsigned int jProcess = 0; jProcess < iProcess; ++jProcess) {
0216 offset += nEntries[iFile][jProcess];
0217 }
0218 ++iStored;
0219 }
0220 }
0221
0222 void OutputProcessBlockHelper::setStoredFileInProcessOffset(
0223 unsigned int iFile,
0224 unsigned int nInputProcesses,
0225 std::vector<std::vector<unsigned int>> const& nEntries,
0226 std::vector<unsigned int>& storedFileInProcessOffset) const {
0227 unsigned int iStored = 0;
0228 for (auto& offset : storedFileInProcessOffset) {
0229 offset = 0;
0230 unsigned int indexInEventProcessor = translateFromStoredIndex_[iStored];
0231
0232 for (unsigned int jFile = 0; jFile < iFile; ++jFile) {
0233 assert(indexInEventProcessor < nEntries[jFile].size());
0234 offset += nEntries[jFile][indexInEventProcessor];
0235 }
0236 ++iStored;
0237 }
0238 }
0239
0240 }