14 association_(association),
21 std::vector<ThinnedAssociationBranches>::const_iterator
26 std::vector<ThinnedAssociationBranches>::const_iterator
31 std::vector<ThinnedAssociationBranches>::const_iterator
37 {
return x.parent() <
y.parent(); });
40 std::vector<ThinnedAssociationBranches>::const_iterator
46 {
return x.parent() <
y.parent(); });
66 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> >
68 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> >
temp;
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 =
90 for(
auto association : associationDescriptions) {
91 if(association->isAlias()) {
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) {
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; });
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);
149 keepAssociation.insert(std::make_pair(association ,
true));
154 keepAssociation.insert(std::make_pair(association ,
false));
159 bool foundMatch =
false;
161 entry != iEnd; ++entry) {
163 entry->thinned() == input.
thinned()) {
174 std::vector<BranchID>
const& associationsFromSecondary) {
175 if(!isSecondaryFile) {
180 std::vector<ThinnedAssociationBranches>
const&
inputData = helper.
data();
181 for (
auto const& inputEntry : inputData) {
186 if(associationsFromSecondary.empty())
return;
188 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > assocToBranches = helper.
associationToBranches();
190 for(
BranchID const& association : associationsFromSecondary) {
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");
209 std::map<BranchID, bool>
const& keepAssociation,
210 std::map<BranchID::value_type, BranchID::value_type>
const& droppedBranchIDToKeptBranchID) {
212 for(
auto const& associationBranches : parentThinnedAssociationsHelper.
data()) {
213 auto keep = keepAssociation.find(associationBranches.association());
214 if(
keep != keepAssociation.end() &&
keep->second) {
216 auto iter = droppedBranchIDToKeptBranchID.find(parent.
id());
217 if(
iter != droppedBranchIDToKeptBranchID.end()) {
220 BranchID thinned = associationBranches.thinned();
221 iter = droppedBranchIDToKeptBranchID.find(thinned.
id());
222 if(
iter != droppedBranchIDToKeptBranchID.end()) {
225 addAssociation(parent, associationBranches.association(), thinned);
234 if(associationsFromSecondary.empty())
return;
236 std::vector<std::pair<BranchID, ThinnedAssociationBranches const*> > assocToBranches =
239 for(
BranchID const& association : associationsFromSecondary) {
241 auto branches = std::lower_bound(assocToBranches.begin(), assocToBranches.end(),
242 std::make_pair(association, static_cast<ThinnedAssociationBranches const*>(
nullptr)),
243 [](std::pair<BranchID, ThinnedAssociationBranches const*>
const&
x,
244 std::pair<BranchID, ThinnedAssociationBranches const*>
const&
y)
245 {
return x.first <
y.first; });
247 if(branches == assocToBranches.end() || branches->first != association) {
249 "ThinnedAssociationHelper::initAssociationsFromSecondary could not find branches information, contact Framework developers");
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 updateFromInput(ThinnedAssociationsHelper const &, bool isSecondaryFile, std::vector< BranchID > const &associationsFromSecondary)
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
std::vector< ThinnedAssociationBranches > vThinnedAssociationBranches_
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)