00001 #include "artdaq/ArtModules/detail/KeptProvenance.h"
00002 #include "art/Framework/Principal/Principal.h"
00003 #include "canvas/Persistency/Provenance/Parentage.h"
00004
00005 using namespace art;
00006
00007 detail::KeptProvenance::KeptProvenance(DropMetaData const dropMetaData,
00008 bool const dropMetaDataForDroppedData,
00009 std::set<BranchID>& branchesWithStoredHistory)
00010 : dropMetaData_{dropMetaData}
00011 , dropMetaDataForDroppedData_{dropMetaDataForDroppedData}
00012 , branchesWithStoredHistory_{branchesWithStoredHistory}
00013 {}
00014
00015 ProductProvenance const&
00016 detail::KeptProvenance::insert(ProductProvenance const& pp)
00017 {
00018 return *provenance_.insert(pp).first;
00019 }
00020
00021 ProductProvenance const&
00022 detail::KeptProvenance::emplace(BranchID const bid, ProductStatus const status)
00023 {
00024 return *provenance_.emplace(bid, status).first;
00025 }
00026
00027
00028 void
00029 detail::KeptProvenance::insertAncestors(ProductProvenance const& iGetParents,
00030 Principal const& principal)
00031 {
00032 if (dropMetaData_ == DropMetaData::DropAll) {
00033 return;
00034 }
00035 if (dropMetaDataForDroppedData_) {
00036 return;
00037 }
00038 auto const& parentBids = iGetParents.parentage().parents();
00039 for (auto const bid : parentBids) {
00040 branchesWithStoredHistory_.insert(bid);
00041 auto info = principal.branchMapper().branchToProductProvenance(bid);
00042 if (!info || dropMetaData_ != DropMetaData::DropNone) {
00043 continue;
00044 }
00045 auto const* bd = principal.getForOutput(info->branchID(), false).desc();
00046 if (bd && bd->produced() && provenance_.insert(*info).second) {
00047
00048 insertAncestors(*info, principal);
00049 }
00050 }
00051 }
00052
00053 void
00054 detail::KeptProvenance::setStatus(ProductProvenance const& key,
00055 ProductStatus const status)
00056 {
00057 if (provenance_.erase(key) != 1ull)
00058 throw Exception(errors::LogicError, "detail::KeptProvenance::setStatus")
00059 << "Attempt to set product status for product whose provenance is not being recorded.\n";
00060 provenance_.emplace(key.branchID(), status);
00061 }