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),
118 atEndTransition_(
false)
127 bool hasAliases =
false;
128 for(
auto const&
prod : prodsList) {
135 auto cbd = std::make_shared<BranchDescription const>(bd);
151 auto cbd =std::make_shared<BranchDescription const>(bd);
158 for(
auto const&
prod : prodsList) {
161 auto cbd = std::make_shared<BranchDescription const>(bd);
170 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
172 std::vector<bool> ambiguous(lookupProcessNames.size(),
false);
174 std::vector<TypeID>
const& sortedTypeIDs =
productLookup_->sortedTypeIDs();
176 std::vector<ProductResolverIndexHelper::IndexAndNames>
const& indexAndNames =
productLookup_->indexAndNames();
177 std::vector<char>
const& processNamesCharArray =
productLookup_->processNames();
179 unsigned int numberOfMatches = 0;
181 if (!sortedTypeIDs.empty()) {
183 for(
unsigned int k = 0, kEnd = sortedTypeIDs.size();
k < kEnd; ++
k) {
185 for (
unsigned int i = range.
begin();
i < range.
end(); ++
i) {
189 if ((numberOfMatches == 1) and
192 productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
194 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
198 ambiguous.assign(lookupProcessNames.size(),
false);
202 productResolverIndex = product.
index();
205 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
206 assert(iter != lookupProcessNames.end());
208 lastMatchIndex = iMatchingIndex;
212 assert(
k >= beginElements);
213 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
215 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
220 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
234 for(
auto const&
prod : *
this) {
235 if(
prod->singleProduct() &&
236 !
prod->productUnavailable() &&
237 !
prod->unscheduledWasNotRun() &&
238 !
prod->branchDescription().dropped()) {
249 for(
auto const&
prod : prodsList) {
252 auto cbd = std::make_shared<BranchDescription const>(bd);
254 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
265 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
271 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
304 for(
auto&
prod : *
this) {
305 prod->resetProductData();
317 assert(
nullptr != phb);
318 phb->unsafe_deleteProduct();
349 std::shared_ptr<ProcessHistory const> inputProcessHistory;
352 auto noDel =[](
void const*){};
353 inputProcessHistory =
354 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
355 if (inputProcessHistory.get() ==
nullptr) {
357 <<
"Principal::fillPrincipal\n" 358 <<
"Input ProcessHistory not found in registry\n" 359 <<
"Contact a Framework developer\n";
363 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
370 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
375 iter != iEnd; ++iter) {
376 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
377 if (nameIter == lookupProcessNames.end()) {
406 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
407 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
408 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
436 <<
"addProductOrThrow: Problem found while adding product, " 437 <<
"product already exists for (" 503 bool skipCurrentProcess,
509 assert(0!=productResolver.get());
510 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
511 if(resolution.isAmbiguous()) {
515 auto productData = resolution.data();
516 if(productData ==
nullptr) {
519 return BasicHandle(productData->wrapper(), &(productData->provenance()));
525 bool skipCurrentProcess,
528 assert(0!=productResolver.get());
529 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,
nullptr,mcc);
539 assert(results.empty());
542 failedToRegisterConsumesMany(typeID);
578 std::vector<ProductResolverBase const*> holders;
585 if(!holders.empty()) {
592 assert(productResolver);
593 holders.push_back(productResolver);
597 if(!holders.empty()) {
612 iter != iEnd; ++iter) {
614 for (
auto productResolver : holders) {
623 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
648 if (skipCurrentProcess) {
654 inputTag.
label().c_str(),
666 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),inputTag.
process());
672 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
702 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
707 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
734 if(phb->unscheduledWasNotRun()) {
735 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
739 return *phb->provenance();
748 for(
auto const& productResolver : *
this) {
749 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
752 if(productResolver->provenance()->branchDescription().present()) {
753 provenances.push_back(productResolver->provenance());
765 for(
auto const& productResolver : *
this) {
766 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
767 if(productResolver->stableProvenance()->branchDescription().present()) {
768 provenances.push_back(productResolver->stableProvenance());
776 for(
auto&
prod : bids) {
800 std::vector<WrapperBase const*>&,
801 std::vector<unsigned int>&)
const {
812 if(edp.get() ==
nullptr) {
814 <<
"put: Cannot put because unique_ptr to product is null." 828 for(
auto const&
prod :
preg_->productList()) {
836 auto cbd = std::make_shared<BranchDescription const>(bd);
847 if(not
reader()) {
return;}
849 for(
auto &
prod : *
this) {
850 prod->retrieveAndMerge(*
this);
856 for(
auto &
prod : *
this) {
857 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
void setupUnscheduled(UnscheduledConfigurator 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
virtual void setupUnscheduled(UnscheduledConfigurator const &)
void getAllProvenance(std::vector< Provenance const * > &provenances) const
void applyToResolvers(F iFunc)
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 setAtEndTransition(bool iAtEnd)
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