21 std::vector<ThinnedAssociationBranches>::const_iterator
23 return vThinnedAssociationBranches_.begin();
26 std::vector<ThinnedAssociationBranches>::const_iterator
28 return vThinnedAssociationBranches_.end();
31 std::vector<ThinnedAssociationBranches>::const_iterator
37 {
return x.parent() < y.parent(); });
40 std::vector<ThinnedAssociationBranches>::const_iterator
46 {
return x.parent() < y.parent(); });
50 std::sort(vThinnedAssociationBranches_.begin(), vThinnedAssociationBranches_.end(),
53 {
return x.
parent() < y.parent() ?
true : y.parent() < x.
parent() ?
false : x.
association() < y.association(); });
63 vThinnedAssociationBranches_.push_back(branches);
66 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> >
68 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> >
temp;
69 for(
auto const& item : vThinnedAssociationBranches_) {
70 temp.push_back(std::make_pair(item.association(), &item));
72 std::sort(temp.begin(), temp.end(), [](std::pair<BranchID, ThinnedAssociationBranches const*>
const& x,
73 std::pair<BranchID, ThinnedAssociationBranches const*>
const& y)
74 {
return x.first < y.first; });
81 std::set<BranchID>
const& keptProductsInEvent,
82 std::map<BranchID, bool>& keepAssociation)
const {
84 keepAssociation.clear();
87 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > assocToBranches =
88 associationToBranches();
92 keepAssociation.insert(std::make_pair(
association->branchID(),
false));
94 std::set<BranchID> branchesInRecursion;
106 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> >
const& associationToBranches,
107 std::set<BranchID>& branchesInRecursion,
108 std::set<BranchID>
const& keptProductsInEvent,
109 std::map<BranchID, bool>& keepAssociation)
const {
113 auto decision = keepAssociation.find(association);
114 if(decision != keepAssociation.end()) {
115 return decision->second;
120 if(!branchesInRecursion.insert(association).second) {
125 auto branches =
std::lower_bound(associationToBranches.begin(), associationToBranches.end(),
126 std::make_pair(association, static_cast<ThinnedAssociationBranches const*>(
nullptr)),
127 [](std::pair<BranchID, ThinnedAssociationBranches const*>
const& x,
128 std::pair<BranchID, ThinnedAssociationBranches const*>
const& y)
129 {
return x.first < y.first; });
131 if(branches == associationToBranches.end() || branches->first !=
association) {
132 throw edm::Exception(
errors::LogicError,
"ThinnedAssociationHelper::shouldKeepAssociation could not find branches information, contact Framework developers");
134 BranchID const& thinnedCollection = branches->second->thinned();
135 if(keptProductsInEvent.find(thinnedCollection) != keptProductsInEvent.end()) {
136 keepAssociation.insert(std::make_pair(association ,
true));
142 auto iterEnd = parentEnd(thinnedCollection);
143 for(
auto match = parentBegin(thinnedCollection);
match != iterEnd; ++
match) {
144 if(shouldKeepAssociation(
match->association(),
145 associationToBranches,
149 keepAssociation.insert(std::make_pair(association ,
true));
154 keepAssociation.insert(std::make_pair(association ,
false));
159 bool foundMatch =
false;
174 if(vThinnedAssociationBranches_.empty()) {
175 vThinnedAssociationBranches_ = helper.
data();
178 std::vector<ThinnedAssociationBranches>
const&
inputData = helper.
data();
179 for (
auto const& inputEntry : inputData) {
180 requireMatch(inputEntry);
185 std::vector<BranchID>
const& associationsFromSecondary) {
186 if(associationsFromSecondary.empty())
return;
188 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > assocToBranches = helper.
associationToBranches();
192 auto branches =
std::lower_bound(assocToBranches.begin(), assocToBranches.end(),
193 std::make_pair(
association, static_cast<ThinnedAssociationBranches const*>(
nullptr)),
194 [](std::pair<BranchID, ThinnedAssociationBranches const*>
const& x,
195 std::pair<BranchID, ThinnedAssociationBranches const*>
const& y)
196 {
return x.first < y.first; });
198 if(branches == assocToBranches.end() || branches->first !=
association) {
200 "ThinnedAssociationHelper::initAssociationsFromSecondary could not find branches information, contact Framework developers");
202 requireMatch(*(branches->second));
208 std::map<BranchID, bool>
const& keepAssociation,
209 std::map<BranchID::value_type, BranchID::value_type>
const& droppedBranchIDToKeptBranchID) {
211 for(
auto const& associationBranches : parentThinnedAssociationsHelper.
data()) {
212 auto keep = keepAssociation.find(associationBranches.association());
213 if(
keep != keepAssociation.end() &&
keep->second) {
215 auto iter = droppedBranchIDToKeptBranchID.find(parent.
id());
216 if(iter != droppedBranchIDToKeptBranchID.end()) {
220 iter = droppedBranchIDToKeptBranchID.find(thinned.
id());
221 if(iter != droppedBranchIDToKeptBranchID.end()) {
224 addAssociation(parent, associationBranches.association(),
thinned);
233 if(associationsFromSecondary.empty())
return;
235 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > assocToBranches =
240 auto branches =
std::lower_bound(assocToBranches.begin(), assocToBranches.end(),
241 std::make_pair(
association, static_cast<ThinnedAssociationBranches const*>(
nullptr)),
242 [](std::pair<BranchID, ThinnedAssociationBranches const*>
const& x,
243 std::pair<BranchID, ThinnedAssociationBranches const*>
const& y)
244 {
return x.first < y.first; });
246 if(branches == assocToBranches.end() || branches->first !=
association) {
248 "ThinnedAssociationHelper::initAssociationsFromSecondary could not find branches information, contact Framework developers");
250 addAssociation(*(branches->second));
void initAssociationsFromSecondary(std::vector< BranchID > const &, ThinnedAssociationsHelper const &)
std::vector< ThinnedAssociationBranches > const & data() const
void addAssociation(BranchID const &, BranchID const &, BranchID const &)
void requireMatch(ThinnedAssociationBranches const &input) const
BranchID const & parent() const
ThinnedAssociationBranches()
std::vector< std::pair< BranchID, ThinnedAssociationBranches const * > > associationToBranches() const
void updateFromPrimaryInput(ThinnedAssociationsHelper const &)
std::vector< ThinnedAssociationBranches >::const_iterator end() const
static std::string const input
std::vector< ThinnedAssociationBranches >::const_iterator parentEnd(BranchID const &) const
void selectAssociationProducts(std::vector< BranchDescription const * > const &associationDescriptions, std::set< BranchID > const &keptProductsInEvent, std::map< BranchID, bool > &keepAssociation) const
BranchID const & association() const
void clear(CLHEP::HepGenMatrix &m)
Helper function: Reset all elements of a matrix to 0.
void updateFromSecondaryInput(ThinnedAssociationsHelper const &, std::vector< BranchID > const &associationsFromSecondary)
std::vector< ThinnedAssociationBranches >::const_iterator begin() const
std::vector< ThinnedAssociationBranches >::const_iterator parentBegin(BranchID const &) const
void updateFromParentProcess(ThinnedAssociationsHelper const &parentThinnedAssociationsHelper, std::map< BranchID, bool > const &keepAssociation, std::map< BranchID::value_type, BranchID::value_type > const &droppedBranchIDToKeptBranchID)
ThinnedAssociationsHelper()
bool shouldKeepAssociation(BranchID const &association, std::vector< std::pair< BranchID, ThinnedAssociationBranches const * > > const &associationToBranches, std::set< BranchID > &branchesInRecursion, std::set< BranchID > const &keptProductsInEvent, std::map< BranchID, bool > &keepAssociation) const
BranchID const & thinned() const
std::string match(BranchDescription const &a, BranchDescription const &b, std::string const &fileName)