File indexing completed on 2025-02-27 07:20:01
0001 #include <algorithm>
0002 #include <cassert>
0003 #include <vector>
0004
0005 #include "FWCore/Sources/interface/DaqProvenanceHelper.h"
0006
0007 #include "DataFormats/Provenance/interface/ProductDependencies.h"
0008 #include "DataFormats/Provenance/interface/BranchIDList.h"
0009 #include "DataFormats/Provenance/interface/ProcessHistory.h"
0010 #include "DataFormats/Provenance/interface/ProcessHistoryRegistry.h"
0011 #include "DataFormats/Provenance/interface/ProductRegistry.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include "FWCore/Utilities/interface/EDMException.h"
0014 #include "FWCore/Reflection/interface/TypeWithDict.h"
0015 #include "FWCore/Version/interface/GetReleaseVersion.h"
0016
0017 namespace {
0018 edm::ProductDescription makeDescriptionForDaqProvHelper(edm::TypeID const& rawDataType,
0019 std::string const& collectionName,
0020 std::string const& friendlyName,
0021 std::string const& sourceLabel) {
0022 edm::ProductDescription desc(edm::InEvent,
0023 "rawDataCollector",
0024
0025 "LHC",
0026
0027 collectionName,
0028 friendlyName,
0029 "",
0030 edm::TypeWithDict(rawDataType.typeInfo()),
0031 false);
0032 desc.setIsProvenanceSetOnRead();
0033 return desc;
0034 }
0035 }
0036
0037 namespace edm {
0038 DaqProvenanceHelper::DaqProvenanceHelper(TypeID const& rawDataType,
0039 std::string const& collectionName,
0040 std::string const& friendlyName,
0041 std::string const& sourceLabel)
0042 : constProductDescription_(
0043 makeDescriptionForDaqProvHelper(rawDataType, collectionName, friendlyName, sourceLabel)),
0044 dummyProvenance_(constProductDescription_.branchID()),
0045 processParameterSet_(),
0046 oldProcessName_(),
0047 oldBranchID_(),
0048 newBranchID_(),
0049 oldProcessHistoryID_(nullptr),
0050 phidMap_() {
0051
0052
0053 std::string const& moduleLabel = constProductDescription_.moduleLabel();
0054 std::string const& processName = constProductDescription_.processName();
0055 typedef std::vector<std::string> vstring;
0056 vstring empty;
0057
0058 vstring modlbl;
0059 modlbl.reserve(1);
0060 modlbl.push_back(moduleLabel);
0061 processParameterSet_.addParameter("@all_sources", modlbl);
0062
0063 ParameterSet triggerPaths;
0064 triggerPaths.addParameter<vstring>("@trigger_paths", empty);
0065 processParameterSet_.addParameter<ParameterSet>("@trigger_paths", triggerPaths);
0066
0067 ParameterSet pseudoInput;
0068 pseudoInput.addParameter<std::string>("@module_edm_type", "Source");
0069 pseudoInput.addParameter<std::string>("@module_label", moduleLabel);
0070 pseudoInput.addParameter<std::string>("@module_type", sourceLabel);
0071 processParameterSet_.addParameter<ParameterSet>(moduleLabel, pseudoInput);
0072
0073 processParameterSet_.addParameter<vstring>("@all_esmodules", empty);
0074 processParameterSet_.addParameter<vstring>("@all_esprefers", empty);
0075 processParameterSet_.addParameter<vstring>("@all_essources", empty);
0076 processParameterSet_.addParameter<vstring>("@all_loopers", empty);
0077 processParameterSet_.addParameter<vstring>("@all_modules", empty);
0078 processParameterSet_.addParameter<vstring>("@end_paths", empty);
0079 processParameterSet_.addParameter<vstring>("@paths", empty);
0080 processParameterSet_.addParameter<std::string>("@process_name", processName);
0081
0082 processParameterSet_.registerIt();
0083
0084
0085 }
0086
0087
0088 DaqProvenanceHelper::DaqProvenanceHelper(TypeID const& rawDataType)
0089 : DaqProvenanceHelper(rawDataType, "FEDRawDataCollection", "FEDRawDataCollection", "FedRawDataInputSource") {}
0090
0091 ProcessHistoryID DaqProvenanceHelper::daqInit(ProductRegistry& productRegistry,
0092 ProcessHistoryRegistry& processHistoryRegistry) const {
0093
0094
0095 productRegistry.copyProduct(constProductDescription_);
0096
0097
0098
0099
0100 ProcessHistory ph;
0101 ph.emplace_back(constProductDescription_.processName(),
0102 processParameterSet_.id(),
0103 getReleaseVersion(),
0104 HardwareResourcesDescription());
0105 processHistoryRegistry.registerProcessHistory(ph);
0106
0107
0108 return ph.setProcessHistoryID();
0109 }
0110
0111 bool DaqProvenanceHelper::matchProcesses(ProcessConfiguration const& newPC, ProcessHistory const& ph) const {
0112 for (auto const& pc : ph) {
0113 if (pc.processName() == oldProcessName_) {
0114
0115 return (pc.releaseVersion() == newPC.releaseVersion());
0116 }
0117 }
0118 return false;
0119 }
0120
0121 void DaqProvenanceHelper::fixMetaData(std::vector<ProcessConfiguration>& pcv, std::vector<ProcessHistory>& phv) {
0122 phv.push_back(ProcessHistory());
0123 std::vector<ProcessConfiguration> newPCs;
0124 for (auto const& pc : pcv) {
0125 if (pc.processName() == oldProcessName_) {
0126 newPCs.emplace_back(constProductDescription_.processName(),
0127 processParameterSet_.id(),
0128 pc.releaseVersion(),
0129 pc.hardwareResourcesDescription());
0130 }
0131 }
0132 if (newPCs.empty()) {
0133 throw Exception(errors::LogicError) << "\nFatal error in RootFile constructor. Most likely this is because\n"
0134 << "the input file contains a FEDRawDataCollection with module label\n"
0135 << "\"source\". This is against CMS naming conventions.\n"
0136 << "See GitHub Issue 45137 for related details.\n";
0137 }
0138 pcv.reserve(pcv.size() + newPCs.size());
0139 pcv.insert(pcv.end(), newPCs.begin(), newPCs.end());
0140
0141 for (auto& ph : phv) {
0142 for (auto const& newPC : newPCs) {
0143 if (ph.empty() || matchProcesses(newPC, ph)) {
0144 ProcessHistoryID oldPHID = ph.id();
0145 ph.push_front(newPC);
0146 ProcessHistoryID newPHID = ph.id();
0147 phidMap_.insert(std::make_pair(oldPHID, newPHID));
0148 break;
0149 }
0150 }
0151 }
0152
0153 phv.reserve(phv.size() + newPCs.size());
0154 for (auto const& newPC : newPCs) {
0155 phv.emplace_back();
0156 phv.back().push_front(newPC);
0157 }
0158 }
0159
0160 void DaqProvenanceHelper::fixMetaData(std::vector<BranchID>& branchID) const {
0161 std::replace(branchID.begin(), branchID.end(), oldBranchID_, newBranchID_);
0162 }
0163
0164 void DaqProvenanceHelper::fixMetaData(BranchIDLists const& branchIDLists) const {
0165 BranchID::value_type oldID = oldBranchID_.id();
0166 BranchID::value_type newID = newBranchID_.id();
0167
0168 BranchIDLists& lists = const_cast<BranchIDLists&>(branchIDLists);
0169 for (auto& list : lists) {
0170 std::replace(list.begin(), list.end(), oldID, newID);
0171 }
0172 }
0173
0174 void DaqProvenanceHelper::fixMetaData(ProductDependencies& productDependencies) const {
0175 typedef std::map<BranchID, std::set<BranchID> > BCMap;
0176
0177 BCMap& childLookup = const_cast<BCMap&>(productDependencies.childLookup());
0178
0179 {
0180 BCMap::iterator i = childLookup.find(oldBranchID_);
0181 if (i != childLookup.end()) {
0182 childLookup.insert(std::make_pair(newBranchID_, i->second));
0183 childLookup.erase(i);
0184 }
0185 }
0186
0187 for (auto& child : childLookup) {
0188 if (child.second.erase(oldBranchID_) != 0) {
0189 child.second.insert(newBranchID_);
0190 }
0191 }
0192 }
0193
0194
0195 ProcessHistoryID const& DaqProvenanceHelper::mapProcessHistoryID(ProcessHistoryID const& phid) {
0196 ProcessHistoryIDMap::const_iterator it = phidMap_.find(phid);
0197 assert(it != phidMap_.end());
0198 oldProcessHistoryID_ = &it->first;
0199 return it->second;
0200 }
0201
0202
0203 ParentageID const& DaqProvenanceHelper::mapParentageID(ParentageID const& parentageID) const {
0204 ParentageIDMap::const_iterator it = parentageIDMap_.find(parentageID);
0205 if (it == parentageIDMap_.end()) {
0206 return parentageID;
0207 }
0208 return it->second;
0209 }
0210
0211
0212 BranchID const& DaqProvenanceHelper::mapBranchID(BranchID const& branchID) const {
0213 return (branchID == oldBranchID_ ? newBranchID_ : branchID);
0214 }
0215
0216 void DaqProvenanceHelper::setOldParentageIDToNew(ParentageID const& iOld, ParentageID const& iNew) {
0217 parentageIDMap_.insert(std::make_pair(iOld, iNew));
0218 }
0219
0220 }