40 returnValue += currentProcess;
44 return processFromInputTag;
51 <<
"Principal::" << where <<
": no product with given branch id: "<< bid <<
"\n";
55 std::shared_ptr<cms::Exception>
60 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for type: " << productType <<
"\n" 61 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 62 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
64 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for a container with elements of type: " << productType <<
"\n" 65 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 66 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
75 exception <<
"Principal::" << where <<
": More than 1 product matches all criteria\nLooking for type: " << productType <<
"\n" 76 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 77 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n" 78 <<
"This can only occur with get function calls using a Handle<View> argument.\n" 79 <<
"Try a get not using a View or change the instance name of one of the products";
85 void failedToRegisterConsumesMany(
edm::TypeID const& iType) {
87 exception <<
"::getManyByType called for " << iType
88 <<
" without a corresponding consumesMany being called for this module. \n";
92 void failedToRegisterConsumes(
KindOfType kindOfType,
98 exception <<
"::getByLabel without corresponding call to consumes or mayConsumes for this module.\n" 99 << (kindOfType ==
PRODUCT_TYPE ?
" type: " :
" type: edm::View<") << productType
100 << (kindOfType ==
PRODUCT_TYPE ?
"\n module label: " :
">\n module label: ") << moduleLabel
101 <<
"\n product instance name: '" << productInstanceName
102 <<
"'\n process name: '" << processName <<
"'\n";
114 std::shared_ptr<ProductResolverIndexHelper const> productLookup,
118 bool isForPrimaryProcess) :
120 processHistoryPtr_(),
122 processHistoryIDBeforeConfig_(),
123 processConfiguration_(&pc),
126 productLookup_(productLookup),
127 lookupProcessOrder_(productLookup->lookupProcessNames().
size(), 0),
130 historyAppender_(historyAppender),
132 atEndTransition_(
false)
141 bool hasAliases =
false;
142 for(
auto const&
prod : prodsList) {
149 auto cbd = std::make_shared<BranchDescription const>(bd);
165 auto cbd =std::make_shared<BranchDescription const>(bd);
172 for(
auto const&
prod : prodsList) {
175 auto cbd = std::make_shared<BranchDescription const>(bd);
184 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
186 std::vector<bool> ambiguous(lookupProcessNames.size(),
false);
188 std::vector<TypeID>
const& sortedTypeIDs =
productLookup_->sortedTypeIDs();
190 std::vector<ProductResolverIndexHelper::IndexAndNames>
const& indexAndNames =
productLookup_->indexAndNames();
191 std::vector<char>
const& processNamesCharArray =
productLookup_->processNames();
193 unsigned int numberOfMatches = 0;
195 if (!sortedTypeIDs.empty()) {
197 for(
unsigned int k = 0, kEnd = sortedTypeIDs.size();
k < kEnd; ++
k) {
199 for (
unsigned int i = range.
begin();
i < range.
end(); ++
i) {
203 if ((numberOfMatches == 1) and
206 productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
208 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
212 ambiguous.assign(lookupProcessNames.size(),
false);
216 productResolverIndex = product.
index();
219 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
220 assert(iter != lookupProcessNames.end());
222 lastMatchIndex = iMatchingIndex;
226 assert(
k >= beginElements);
227 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
229 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
234 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
248 for(
auto const&
prod : *
this) {
249 if(
prod->singleProduct() &&
250 !
prod->productUnavailable() &&
251 !
prod->unscheduledWasNotRun() &&
252 !
prod->branchDescription().dropped()) {
263 for(
auto const&
prod : prodsList) {
266 auto cbd = std::make_shared<BranchDescription const>(bd);
268 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
279 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
285 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
319 for(
auto&
prod : *
this) {
320 prod->resetProductData();
332 assert(
nullptr != phb);
333 phb->unsafe_deleteProduct();
360 processHistoryRegistry. getMapped(hist),
367 std::shared_ptr<ProcessHistory const> inputProcessHistory;
371 auto noDel =[](
void const*){};
372 inputProcessHistory =
373 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
374 if (inputProcessHistory.get() ==
nullptr) {
376 <<
"Principal::fillPrincipal\n" 377 <<
"Input ProcessHistory not found in registry\n" 378 <<
"Contact a Framework developer\n";
382 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
385 processHistoryPtr_ = inputProcessHistory;
391 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
404 if (nameIter != lookupProcessNames.end()) {
417 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
418 if (nameIter == lookupProcessNames.end()) {
447 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
448 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
449 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
477 <<
"addProductOrThrow: Problem found while adding product, " 478 <<
"product already exists for (" 513 if(result ==
nullptr) {
533 if(result ==
nullptr) {
545 bool skipCurrentProcess,
551 assert(
nullptr!=productResolver.get());
552 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
553 if(resolution.isAmbiguous()) {
557 auto productData = resolution.data();
558 if(productData ==
nullptr) {
561 return BasicHandle(productData->wrapper(), &(productData->provenance()));
567 bool skipCurrentProcess,
570 assert(
nullptr!=productResolver.get());
571 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,
nullptr,mcc);
581 assert(results.empty());
584 failedToRegisterConsumesMany(typeID);
620 std::vector<ProductResolverBase const*> holders;
627 if(!holders.empty()) {
634 assert(productResolver);
635 holders.push_back(productResolver);
639 if(!holders.empty()) {
654 iter != iEnd; ++iter) {
656 for (
auto productResolver : holders) {
665 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
690 if (skipCurrentProcess) {
698 inputTag.
label().c_str(),
711 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),
718 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
749 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
754 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
781 if(phb->unscheduledWasNotRun()) {
782 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
786 return *phb->provenance();
795 for(
auto const& productResolver : *
this) {
796 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
799 if(productResolver->provenance()->branchDescription().present()) {
800 provenances.push_back(productResolver->provenance());
812 for(
auto const& productResolver : *
this) {
813 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
814 if(productResolver->stableProvenance()->branchDescription().present()) {
815 provenances.push_back(productResolver->stableProvenance());
823 for(
auto&
prod : bids) {
847 std::vector<WrapperBase const*>&,
848 std::vector<unsigned int>&)
const {
859 if(edp.get() ==
nullptr) {
861 <<
"put: Cannot put because unique_ptr to product is null." 875 for(
auto const&
prod :
preg_->productList()) {
883 auto cbd = std::make_shared<BranchDescription const>(bd);
894 if(not
reader()) {
return;}
896 for(
auto &
prod : *
this) {
897 prod->retrieveAndMerge(*
this);
903 for(
auto &
prod : *
this) {
904 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
ProcessHistoryID processHistoryIDBeforeConfig_
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
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)
DelayedReader * reader() const
bool registeredToConsumeMany(TypeID const &, BranchType) const
void addUnscheduledProduct(std::shared_ptr< BranchDescription const > bd)
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
unsigned long CacheIdentifier_t
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
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const ¤tProcess)
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_
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=nullptr) const
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