artdaq  v2_03_02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
KeptProvenance.cc
1 #include "artdaq/ArtModules/detail/KeptProvenance.h"
2 #include "art/Framework/Principal/Principal.h"
3 #include "canvas/Persistency/Provenance/Parentage.h"
4 
5 using namespace art;
6 
7 detail::KeptProvenance::KeptProvenance(DropMetaData const dropMetaData,
8  bool const dropMetaDataForDroppedData,
9  std::set<BranchID>& branchesWithStoredHistory)
10  : dropMetaData_{dropMetaData}
11  , dropMetaDataForDroppedData_{dropMetaDataForDroppedData}
12  , branchesWithStoredHistory_{branchesWithStoredHistory}
13 {}
14 
15 ProductProvenance const&
16 detail::KeptProvenance::insert(ProductProvenance const& pp)
17 {
18  return *provenance_.insert(pp).first;
19 }
20 
21 ProductProvenance const&
22 detail::KeptProvenance::emplace(BranchID const bid, ProductStatus const status)
23 {
24  return *provenance_.emplace(bid, status).first;
25 }
26 
27 
28 void
29 detail::KeptProvenance::insertAncestors(ProductProvenance const& iGetParents,
30  Principal const& principal)
31 {
32  if (dropMetaData_ == DropMetaData::DropAll) {
33  return;
34  }
35  if (dropMetaDataForDroppedData_) {
36  return;
37  }
38  auto const& parentBids = iGetParents.parentage().parents();
39  for (auto const bid : parentBids) {
40  branchesWithStoredHistory_.insert(bid);
41  auto info = principal.branchMapper().branchToProductProvenance(bid);
42  if (!info || dropMetaData_ != DropMetaData::DropNone) {
43  continue;
44  }
45  auto const* bd = principal.getForOutput(info->branchID(), false).desc();
46  if (bd && bd->produced() && provenance_.insert(*info).second) {
47  // FIXME: Remove recursion!
48  insertAncestors(*info, principal);
49  }
50  }
51 }
52 
53 void
54 detail::KeptProvenance::setStatus(ProductProvenance const& key,
55  ProductStatus const status)
56 {
57  if (provenance_.erase(key) != 1ull)
58  throw Exception(errors::LogicError, "detail::KeptProvenance::setStatus")
59  << "Attempt to set product status for product whose provenance is not being recorded.\n";
60  provenance_.emplace(key.branchID(), status);
61 }