38 <<
"Principal::" << where <<
": no product with given branch id: "<< bid <<
"\n";
42 std::shared_ptr<cms::Exception>
47 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for type: " << productType <<
"\n" 48 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 49 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
51 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for a container with elements of type: " << productType <<
"\n" 52 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 53 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
62 exception <<
"Principal::" << where <<
": More than 1 product matches all criteria\nLooking for type: " << productType <<
"\n" 63 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 64 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n" 65 <<
"This can only occur with get function calls using a Handle<View> argument.\n" 66 <<
"Try a get not using a View or change the instance name of one of the products";
72 void failedToRegisterConsumesMany(
edm::TypeID const& iType) {
74 exception <<
"::getManyByType called for " << iType
75 <<
" without a corresponding consumesMany being called for this module. \n";
79 void failedToRegisterConsumes(
KindOfType kindOfType,
85 exception <<
"::getByLabel without corresponding call to consumes or mayConsumes for this module.\n" 86 << (kindOfType ==
PRODUCT_TYPE ?
" type: " :
" type: edm::View<") << productType
87 << (kindOfType ==
PRODUCT_TYPE ?
"\n module label: " :
">\n module label: ") << moduleLabel
88 <<
"\n product instance name: '" << productInstanceName
89 <<
"'\n process name: '" << processName <<
"'\n";
101 std::shared_ptr<ProductResolverIndexHelper const> productLookup,
105 bool isForPrimaryProcess) :
107 processHistoryPtr_(),
109 processConfiguration_(&pc),
112 productLookup_(productLookup),
113 lookupProcessOrder_(productLookup->lookupProcessNames().
size(), 0),
116 historyAppender_(historyAppender),
126 bool hasAliases =
false;
127 for(
auto const&
prod : prodsList) {
134 auto cbd = std::make_shared<BranchDescription const>(bd);
150 auto cbd =std::make_shared<BranchDescription const>(bd);
157 for(
auto const&
prod : prodsList) {
160 auto cbd = std::make_shared<BranchDescription const>(bd);
169 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
171 std::vector<bool> ambiguous(lookupProcessNames.size(),
false);
173 std::vector<TypeID>
const& sortedTypeIDs =
productLookup_->sortedTypeIDs();
175 std::vector<ProductResolverIndexHelper::IndexAndNames>
const& indexAndNames =
productLookup_->indexAndNames();
176 std::vector<char>
const& processNamesCharArray =
productLookup_->processNames();
178 unsigned int numberOfMatches = 0;
180 if (!sortedTypeIDs.empty()) {
182 for(
unsigned int k = 0, kEnd = sortedTypeIDs.size();
k < kEnd; ++
k) {
184 for (
unsigned int i = range.
begin();
i < range.
end(); ++
i) {
188 if ((numberOfMatches == 1) and
191 productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
193 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
197 ambiguous.assign(lookupProcessNames.size(),
false);
201 productResolverIndex = product.
index();
204 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
205 assert(iter != lookupProcessNames.end());
207 lastMatchIndex = iMatchingIndex;
211 assert(
k >= beginElements);
212 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
214 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
219 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
233 for(
auto const&
prod : *
this) {
234 if(
prod->singleProduct() &&
235 !
prod->productUnavailable() &&
236 !
prod->unscheduledWasNotRun() &&
237 !
prod->branchDescription().dropped()) {
248 for(
auto const&
prod : prodsList) {
251 auto cbd = std::make_shared<BranchDescription const>(bd);
253 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
264 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
270 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
303 for(
auto&
prod : *
this) {
304 prod->resetProductData();
311 assert(
nullptr != phb);
312 phb->unsafe_deleteProduct();
334 std::shared_ptr<ProcessHistory const> inputProcessHistory;
337 auto noDel =[](
void const*){};
338 inputProcessHistory =
339 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
340 if (inputProcessHistory.get() ==
nullptr) {
342 <<
"Principal::fillPrincipal\n" 343 <<
"Input ProcessHistory not found in registry\n" 344 <<
"Contact a Framework developer\n";
348 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
355 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
360 iter != iEnd; ++iter) {
361 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
362 if (nameIter == lookupProcessNames.end()) {
391 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
392 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
393 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
421 <<
"addProductOrThrow: Problem found while adding product, " 422 <<
"product already exists for (" 488 bool skipCurrentProcess,
494 assert(0!=productResolver.get());
495 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
496 if(resolution.isAmbiguous()) {
500 auto productData = resolution.data();
501 if(productData ==
nullptr) {
504 return BasicHandle(productData->wrapper(), &(productData->provenance()));
510 bool skipCurrentProcess,
513 assert(0!=productResolver.get());
514 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,
nullptr,mcc);
524 assert(results.empty());
527 failedToRegisterConsumesMany(typeID);
563 std::vector<ProductResolverBase const*> holders;
570 if(!holders.empty()) {
577 assert(productResolver);
578 holders.push_back(productResolver);
582 if(!holders.empty()) {
597 iter != iEnd; ++iter) {
599 for (
auto productResolver : holders) {
608 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
633 if (skipCurrentProcess) {
639 inputTag.
label().c_str(),
651 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),inputTag.
process());
657 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
687 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
692 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
719 if(phb->unscheduledWasNotRun()) {
720 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
724 return *phb->provenance();
733 for(
auto const& productResolver : *
this) {
734 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
737 if(productResolver->provenance()->branchDescription().present()) {
738 provenances.push_back(productResolver->provenance());
750 for(
auto const& productResolver : *
this) {
751 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
752 if(productResolver->stableProvenance()->branchDescription().present()) {
753 provenances.push_back(productResolver->stableProvenance());
761 for(
auto&
prod : bids) {
785 std::vector<WrapperBase const*>&,
786 std::vector<unsigned int>&)
const {
797 if(edp.get() ==
nullptr) {
799 <<
"put: Cannot put because unique_ptr to product is null." 813 for(
auto const&
prod :
preg_->productList()) {
821 auto cbd = std::make_shared<BranchDescription const>(bd);
832 if(not
reader()) {
return;}
834 for(
auto &
prod : *
this) {
835 prod->retrieveAndMerge(*
this);
841 for(
auto &
prod : *
this) {
842 prod->resetFailedFromThisProcess();
ProductResolverIndex index(unsigned int i) const
static ProcessHistory const s_emptyProcessHistory
ProductRegistry const & productRegistry() const
Provenance const & provenance() const
std::string const & branchName() const
BranchType const & branchType() const
unsigned int ProductResolverIndex
bool getMapped(ProcessHistoryID const &key, ProcessHistory &value) const
static std::string const source("source")
ProductResolverCollection productResolvers_
std::shared_ptr< ProcessHistory const > processHistoryPtr_
static PFTauRenderPlugin instance
std::shared_ptr< ProductResolverBase > SharedProductPtr
void addProduct_(std::unique_ptr< ProductResolverBase > phb)
static std::atomic< Principal::CacheIdentifier_t > s_nextIdentifier
std::map< BranchKey, BranchDescription > ProductList
static Principal::CacheIdentifier_t nextIdentifier()
ProcessHistoryID processHistoryID_
void mergeReaders(DelayedReader *other)
ProductResolverBase * getExistingProduct(BranchID const &branchID)
bool isFullyResolved(unsigned int i) const
void getAllProvenance(std::vector< Provenance const * > &provenances) const
void getAllStableProvenance(std::vector< StableProvenance const * > &provenances) const
Provenance getProvenance(BranchID const &bid, ModuleCallingContext const *mcc) const
WrapperBase const * wrapper() const
virtual void getThinnedProducts(ProductID const &, std::vector< WrapperBase const * > &, std::vector< unsigned int > &) const override
unsigned int startInProcessNames() const
std::string const & processName() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Principal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< ProductResolverIndexHelper const > productLookup, ProcessConfiguration const &pc, BranchType bt, HistoryAppender *historyAppender, bool isForPrimaryProcess=true)
void addInputProduct(std::shared_ptr< BranchDescription const > bd)
edm::propagate_const< HistoryAppender * > historyAppender_
void readAllFromSourceAndMergeImmediately()
static void throwAmbiguousException(const char *where, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
std::string const & processName() const
ProductList const & productList() const
std::vector< unsigned int > lookupProcessOrder_
BasicHandle getByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
void addScheduledProduct(std::shared_ptr< BranchDescription const > bd)
ProductResolverIndex index() const
std::string const & className() const
ProductData const * findProductByTag(TypeID const &typeID, InputTag const &tag, ModuleCallingContext const *mcc) const
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
std::string const & moduleLabel() const
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
std::shared_ptr< ProductRegistry const > preg_
std::string const & productInstanceName() const
bool registeredToConsume(ProductResolverIndex, bool, BranchType) const
CacheIdentifier_t cacheIdentifier_
BranchType const & branchType() const
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
void putOrMerge(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
void prefetchAsync(WaitingTask *waitTask, ProductResolverIndex index, bool skipCurrentProcess, ModuleCallingContext const *mcc) const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
unsigned int numberOfMatches() const
void addSourceProduct(std::shared_ptr< BranchDescription const > bd)
Matches relatedIndexes(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance) const
ProcessHistoryID orderProcessHistoryID_
std::string const & friendlyClassName() const
BranchID const & branchID() const
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void addParentProcessProduct(std::shared_ptr< BranchDescription const > bd)
Hash< ProcessHistoryType > ProcessHistoryID
DelayedReader * reader() const
bool registeredToConsumeMany(TypeID const &, BranchType) const
void addUnscheduledProduct(std::shared_ptr< BranchDescription const > bd)
virtual WrapperBase const * getIt(ProductID const &) const override
ProductResolverIndexHelper const & productLookup() const
void resetFailedFromThisProcess()
static std::shared_ptr< cms::Exception > makeNotFoundException(char const *where, KindOfType kindOfType, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
ProductResolverBase const * ConstProductResolverPtr
void findProducts(std::vector< ProductResolverBase const * > const &holders, TypeID const &typeID, BasicHandleVec &results, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=0) const
unsigned long CacheIdentifier_t
virtual WrapperBase const * getThinnedProduct(ProductID const &, unsigned int &) const override
bool adjustToNewProductRegistry(ProductRegistry const ®)
BranchDescription const & branchDescription() const
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
ConstProductResolverPtr getProductResolverByIndex(ProductResolverIndex const &oid) const
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
void resetBranchDescription(std::shared_ptr< BranchDescription const > bd)
unsigned int begin() const
void adjustIndexesAfterProductRegistryAddition()
static void throwProductNotFoundException(char const *where, errors::ErrorCodes error, BranchID const &bid)
BasicHandle getByToken(KindOfType kindOfType, TypeID const &typeID, ProductResolverIndex index, bool skipCurrentProcess, bool &ambiguous, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
void addAliasedProduct(std::shared_ptr< BranchDescription const > bd)
void fillPrincipal(ProcessHistoryID const &hist, ProcessHistoryRegistry const &phr, DelayedReader *reader)
void putOrMergeProduct(std::unique_ptr< WrapperBase > edp) const
void recombine(Principal &other, std::vector< BranchID > const &bids)
ProcessConfiguration const * processConfiguration_
std::vector< BasicHandle > BasicHandleVec
void getManyByType(TypeID const &typeID, BasicHandleVec &results, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
void deleteProduct(BranchID const &id) const