File indexing completed on 2025-01-31 02:19:10
0001 #ifndef DataFormats_Provenance_ThinnedAssociationsHelper_h
0002 #define DataFormats_Provenance_ThinnedAssociationsHelper_h
0003
0004
0005
0006
0007
0008 #include "DataFormats/Provenance/interface/BranchID.h"
0009 #include "DataFormats/Provenance/interface/ProductDescriptionFwd.h"
0010
0011 #include <map>
0012 #include <set>
0013 #include <vector>
0014
0015 namespace edm {
0016
0017 class ThinnedAssociationBranches {
0018 public:
0019 ThinnedAssociationBranches();
0020 ThinnedAssociationBranches(BranchID const&, BranchID const&, BranchID const&, bool slimmed);
0021
0022 BranchID const& parent() const { return parent_; }
0023 BranchID const& association() const { return association_; }
0024 BranchID const& thinned() const { return thinned_; }
0025 bool isSlimmed() const { return slimmed_; }
0026
0027 bool operator<(ThinnedAssociationBranches const& rhs) const { return parent_ < rhs.parent_; }
0028
0029 private:
0030 BranchID parent_;
0031 BranchID association_;
0032 BranchID thinned_;
0033 bool slimmed_ = false;
0034 };
0035
0036 class ThinnedAssociationsHelper {
0037 public:
0038 ThinnedAssociationsHelper();
0039
0040 std::vector<ThinnedAssociationBranches>::const_iterator begin() const;
0041 std::vector<ThinnedAssociationBranches>::const_iterator end() const;
0042
0043 std::vector<ThinnedAssociationBranches>::const_iterator parentBegin(BranchID const&) const;
0044 std::vector<ThinnedAssociationBranches>::const_iterator parentEnd(BranchID const&) const;
0045
0046 void addAssociation(BranchID const&, BranchID const&, BranchID const&, bool slimmed);
0047 void addAssociation(ThinnedAssociationBranches const&);
0048
0049 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > associationToBranches() const;
0050
0051 void clear() { vThinnedAssociationBranches_.clear(); }
0052
0053 void selectAssociationProducts(std::vector<ProductDescription const*> const& associationDescriptions,
0054 std::set<BranchID> const& keptProductsInEvent,
0055 std::map<BranchID, bool>& keepAssociation) const;
0056
0057 std::vector<ThinnedAssociationBranches> const& data() const { return vThinnedAssociationBranches_; }
0058
0059 void requireMatch(ThinnedAssociationBranches const& input) const;
0060
0061 void updateFromPrimaryInput(ThinnedAssociationsHelper const&);
0062
0063 void updateFromSecondaryInput(ThinnedAssociationsHelper const&,
0064 std::vector<BranchID> const& associationsFromSecondary);
0065
0066 void updateFromParentProcess(
0067 ThinnedAssociationsHelper const& parentThinnedAssociationsHelper,
0068 std::map<BranchID, bool> const& keepAssociation,
0069 std::map<BranchID::value_type, BranchID::value_type> const& droppedBranchIDToKeptBranchID);
0070
0071 void initAssociationsFromSecondary(std::vector<BranchID> const&, ThinnedAssociationsHelper const&);
0072
0073 private:
0074 bool shouldKeepAssociation(
0075 BranchID const& association,
0076 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > const& associationToBranches,
0077 std::set<BranchID>& branchesInRecursion,
0078 std::set<BranchID> const& keptProductsInEvent,
0079 std::map<BranchID, bool>& keepAssociation) const;
0080 std::vector<ThinnedAssociationBranches>::const_iterator lower_bound(
0081 ThinnedAssociationBranches const& branches) const;
0082
0083 void ensureSlimmingConstraints() const;
0084
0085 std::vector<ThinnedAssociationBranches> vThinnedAssociationBranches_;
0086 };
0087 }
0088 #endif