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 processConfiguration_(&pc),
125 productLookup_(productLookup),
126 lookupProcessOrder_(productLookup->lookupProcessNames().
size(), 0),
129 historyAppender_(historyAppender),
131 atEndTransition_(
false)
140 bool hasAliases =
false;
141 for(
auto const&
prod : prodsList) {
148 auto cbd = std::make_shared<BranchDescription const>(bd);
164 auto cbd =std::make_shared<BranchDescription const>(bd);
171 for(
auto const&
prod : prodsList) {
174 auto cbd = std::make_shared<BranchDescription const>(bd);
183 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
185 std::vector<bool> ambiguous(lookupProcessNames.size(),
false);
187 std::vector<TypeID>
const& sortedTypeIDs =
productLookup_->sortedTypeIDs();
189 std::vector<ProductResolverIndexHelper::IndexAndNames>
const& indexAndNames =
productLookup_->indexAndNames();
190 std::vector<char>
const& processNamesCharArray =
productLookup_->processNames();
192 unsigned int numberOfMatches = 0;
194 if (!sortedTypeIDs.empty()) {
196 for(
unsigned int k = 0, kEnd = sortedTypeIDs.size();
k < kEnd; ++
k) {
198 for (
unsigned int i = range.
begin();
i < range.
end(); ++
i) {
202 if ((numberOfMatches == 1) and
205 productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
207 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
211 ambiguous.assign(lookupProcessNames.size(),
false);
215 productResolverIndex = product.
index();
218 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
219 assert(iter != lookupProcessNames.end());
221 lastMatchIndex = iMatchingIndex;
225 assert(
k >= beginElements);
226 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
228 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
233 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
247 for(
auto const&
prod : *
this) {
248 if(
prod->singleProduct() &&
249 !
prod->productUnavailable() &&
250 !
prod->unscheduledWasNotRun() &&
251 !
prod->branchDescription().dropped()) {
262 for(
auto const&
prod : prodsList) {
265 auto cbd = std::make_shared<BranchDescription const>(bd);
267 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
278 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
284 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
317 for(
auto&
prod : *
this) {
318 prod->resetProductData();
330 assert(
nullptr != phb);
331 phb->unsafe_deleteProduct();
362 std::shared_ptr<ProcessHistory const> inputProcessHistory;
365 auto noDel =[](
void const*){};
366 inputProcessHistory =
367 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
368 if (inputProcessHistory.get() ==
nullptr) {
370 <<
"Principal::fillPrincipal\n" 371 <<
"Input ProcessHistory not found in registry\n" 372 <<
"Contact a Framework developer\n";
376 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
383 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
396 if (nameIter != lookupProcessNames.end()) {
409 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
410 if (nameIter == lookupProcessNames.end()) {
439 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
440 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
441 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
469 <<
"addProductOrThrow: Problem found while adding product, " 470 <<
"product already exists for (" 537 bool skipCurrentProcess,
543 assert(0!=productResolver.get());
544 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
545 if(resolution.isAmbiguous()) {
549 auto productData = resolution.data();
550 if(productData ==
nullptr) {
553 return BasicHandle(productData->wrapper(), &(productData->provenance()));
559 bool skipCurrentProcess,
562 assert(0!=productResolver.get());
563 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,
nullptr,mcc);
573 assert(results.empty());
576 failedToRegisterConsumesMany(typeID);
612 std::vector<ProductResolverBase const*> holders;
619 if(!holders.empty()) {
626 assert(productResolver);
627 holders.push_back(productResolver);
631 if(!holders.empty()) {
646 iter != iEnd; ++iter) {
648 for (
auto productResolver : holders) {
657 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
682 if (skipCurrentProcess) {
690 inputTag.
label().c_str(),
703 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),
710 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
741 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
746 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
773 if(phb->unscheduledWasNotRun()) {
774 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
778 return *phb->provenance();
787 for(
auto const& productResolver : *
this) {
788 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
791 if(productResolver->provenance()->branchDescription().present()) {
792 provenances.push_back(productResolver->provenance());
804 for(
auto const& productResolver : *
this) {
805 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
806 if(productResolver->stableProvenance()->branchDescription().present()) {
807 provenances.push_back(productResolver->stableProvenance());
815 for(
auto&
prod : bids) {
839 std::vector<WrapperBase const*>&,
840 std::vector<unsigned int>&)
const {
851 if(edp.get() ==
nullptr) {
853 <<
"put: Cannot put because unique_ptr to product is null." 867 for(
auto const&
prod :
preg_->productList()) {
875 auto cbd = std::make_shared<BranchDescription const>(bd);
886 if(not
reader()) {
return;}
888 for(
auto &
prod : *
this) {
889 prod->retrieveAndMerge(*
this);
895 for(
auto &
prod : *
this) {
896 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
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_
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