Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-31 02:19:10

0001 #ifndef DataFormats_Provenance_ThinnedAssociationsHelper_h
0002 #define DataFormats_Provenance_ThinnedAssociationsHelper_h
0003 
0004 /** \class edm::ThinnedAssociationsHelper
0005 \author W. David Dagenhart, created 11 June 2014
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 }  // namespace edm
0088 #endif