28 class ModuleCallingContext;
85 std::map<BranchID, bool>& oMap,
86 std::set<BranchID>& oMapperMissing) {
87 for(std::vector<BranchID>::const_iterator it = iInfo.
parentage().
parents().begin(),
92 if(oMap.find(*it) == oMap.end()) {
97 markAncestors(*pInfo, iMapper, oMap, oMapperMissing);
99 oMapperMissing.insert(*it);
111 std::map<BranchID, bool> seenParentInPrincipal;
112 std::set<BranchID> missingFromMapper;
113 std::set<BranchID> missingProductProvenance;
115 std::map<BranchID, std::shared_ptr<ProductHolderBase const>> idToProductHolder;
116 for(
auto const& product : e) {
117 if(product && product->singleProduct()) {
118 BranchID branchID = product->branchDescription().branchID();
120 if(product->productUnavailable()) {
122 OutputHandle const oh = e.getForOutput(branchID,
false, mcc);
124 bool cannotFindProductProvenance=
false;
125 if(!product->productProvenancePtr()) {
126 missingProductProvenance.insert(branchID);
127 cannotFindProductProvenance=
true;
131 missingFromMapper.insert(branchID);
134 if(cannotFindProductProvenance) {
137 markAncestors(*(product->productProvenancePtr()), *mapperPtr, seenParentInPrincipal, missingFromMapper);
139 seenParentInPrincipal[branchID] =
true;
146 std::set<BranchID> branchesInReg;
147 for(ProductRegistry::ProductList::const_iterator it = prodList.begin(), itEnd = prodList.end();
150 branchesInReg.insert(it->second.branchID());
153 std::set<BranchID> missingFromPrincipal;
154 std::set<BranchID> missingFromReg;
155 for(std::map<BranchID, bool>::iterator it = seenParentInPrincipal.begin(), itEnd = seenParentInPrincipal.end();
159 missingFromPrincipal.insert(it->first);
161 if(branchesInReg.find(it->first) == branchesInReg.end()) {
162 missingFromReg.insert(it->first);
166 if(missingFromMapper.size()) {
167 LogError(
"ProvenanceChecker") <<
"Missing the following BranchIDs from ProductProvenanceRetriever\n";
168 for(std::set<BranchID>::iterator it = missingFromMapper.begin(), itEnd = missingFromMapper.end();
171 LogProblem(
"ProvenanceChecker") << *it<<
" "<<idToProductHolder[*it]->branchDescription();
174 if(missingFromPrincipal.size()) {
175 LogError(
"ProvenanceChecker") <<
"Missing the following BranchIDs from EventPrincipal\n";
176 for(std::set<BranchID>::iterator it = missingFromPrincipal.begin(), itEnd = missingFromPrincipal.end();
183 if(missingProductProvenance.size()) {
184 LogError(
"ProvenanceChecker") <<
"The ProductHolders for the following BranchIDs have no ProductProvenance\n";
185 for(std::set<BranchID>::iterator it = missingProductProvenance.begin(), itEnd = missingProductProvenance.end();
188 LogProblem(
"ProvenanceChecker") << *it<<
" "<<idToProductHolder[*it]->branchDescription();
192 if(missingFromReg.size()) {
193 LogError(
"ProvenanceChecker") <<
"Missing the following BranchIDs from ProductRegistry\n";
194 for(std::set<BranchID>::iterator it = missingFromReg.begin(), itEnd = missingFromReg.end();
201 if(missingFromMapper.size() || missingFromPrincipal.size() || missingProductProvenance.size() || missingFromReg.size()) {
203 << (missingFromMapper.size() || missingFromPrincipal.size() ?
"Having missing ancestors" :
"")
204 << (missingFromMapper.size() ?
" from ProductProvenanceRetriever" :
"")
205 << (missingFromMapper.size() && missingFromPrincipal.size() ?
" and" :
"")
206 << (missingFromPrincipal.size() ?
" from EventPrincipal" :
"")
207 << (missingFromMapper.size() || missingFromPrincipal.size() ?
".\n" :
"")
208 << (missingProductProvenance.size() ?
" Have missing ProductProvenance's from ProductHolder in EventPrincipal.\n" :
"")
209 << (missingFromReg.size() ?
" Have missing info from ProductRegistry.\n" :
"");
224 descriptions.
add(
"provenanceChecker", desc);
#define DEFINE_FWK_MODULE(type)
std::map< BranchKey, BranchDescription > ProductList
virtual void write(EventPrincipal const &e, ModuleCallingContext const *) override
std::vector< BranchID > const & parents() const
ProductList const & productList() const
virtual ~ProvenanceCheckerOutputModule()
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
virtual void writeLuminosityBlock(LuminosityBlockPrincipal const &, ModuleCallingContext const *) override
virtual void writeRun(RunPrincipal const &, ModuleCallingContext const *) override
void add(std::string const &label, ParameterSetDescription const &psetDescription)
ProvenanceCheckerOutputModule(ParameterSet const &pset)
static void fillDescription(ParameterSetDescription &desc)
ProductProvenance const * branchIDToProvenance(BranchID const &bid) const
static void fillDescriptions(ConfigurationDescriptions &descriptions)
Parentage const & parentage() const