39 returnValue += currentProcess;
43 return processFromInputTag;
50 <<
"Principal::" << where <<
": no product with given branch id: "<< bid <<
"\n";
54 std::shared_ptr<cms::Exception>
59 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for type: " << productType <<
"\n" 60 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 61 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
63 *exception <<
"Principal::" << where <<
": Found zero products matching all criteria\nLooking for a container with elements of type: " << productType <<
"\n" 64 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 65 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n";
74 exception <<
"Principal::" << where <<
": More than 1 product matches all criteria\nLooking for type: " << productType <<
"\n" 75 <<
"Looking for module label: " << label <<
"\n" <<
"Looking for productInstanceName: " << instance <<
"\n" 76 << (process.empty() ?
"" :
"Looking for process: ") << process <<
"\n" 77 <<
"This can only occur with get function calls using a Handle<View> argument.\n" 78 <<
"Try a get not using a View or change the instance name of one of the products";
84 void failedToRegisterConsumesMany(
edm::TypeID const& iType) {
86 exception <<
"::getManyByType called for " << iType
87 <<
" without a corresponding consumesMany being called for this module. \n";
91 void failedToRegisterConsumes(
KindOfType kindOfType,
97 exception <<
"::getByLabel without corresponding call to consumes or mayConsumes for this module.\n" 98 << (kindOfType ==
PRODUCT_TYPE ?
" type: " :
" type: edm::View<") << productType
99 << (kindOfType ==
PRODUCT_TYPE ?
"\n module label: " :
">\n module label: ") << moduleLabel
100 <<
"\n product instance name: '" << productInstanceName
101 <<
"'\n process name: '" << processName <<
"'\n";
113 std::shared_ptr<ProductResolverIndexHelper const> productLookup,
117 bool isForPrimaryProcess) :
119 processHistoryPtr_(),
121 processConfiguration_(&pc),
124 productLookup_(productLookup),
125 lookupProcessOrder_(productLookup->lookupProcessNames().
size(), 0),
128 historyAppender_(historyAppender),
130 atEndTransition_(
false)
139 bool hasAliases =
false;
140 for(
auto const&
prod : prodsList) {
147 auto cbd = std::make_shared<BranchDescription const>(bd);
163 auto cbd =std::make_shared<BranchDescription const>(bd);
170 for(
auto const&
prod : prodsList) {
173 auto cbd = std::make_shared<BranchDescription const>(bd);
182 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
184 std::vector<bool> ambiguous(lookupProcessNames.size(),
false);
186 std::vector<TypeID>
const& sortedTypeIDs =
productLookup_->sortedTypeIDs();
188 std::vector<ProductResolverIndexHelper::IndexAndNames>
const& indexAndNames =
productLookup_->indexAndNames();
189 std::vector<char>
const& processNamesCharArray =
productLookup_->processNames();
191 unsigned int numberOfMatches = 0;
193 if (!sortedTypeIDs.empty()) {
195 for(
unsigned int k = 0, kEnd = sortedTypeIDs.size();
k < kEnd; ++
k) {
197 for (
unsigned int i = range.
begin();
i < range.
end(); ++
i) {
201 if ((numberOfMatches == 1) and
204 productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
206 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
210 ambiguous.assign(lookupProcessNames.size(),
false);
214 productResolverIndex = product.
index();
217 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
218 assert(iter != lookupProcessNames.end());
220 lastMatchIndex = iMatchingIndex;
224 assert(
k >= beginElements);
225 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
227 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
232 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
246 for(
auto const&
prod : *
this) {
247 if(
prod->singleProduct() &&
248 !
prod->productUnavailable() &&
249 !
prod->unscheduledWasNotRun() &&
250 !
prod->branchDescription().dropped()) {
261 for(
auto const&
prod : prodsList) {
264 auto cbd = std::make_shared<BranchDescription const>(bd);
266 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
277 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
283 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
316 for(
auto&
prod : *
this) {
317 prod->resetProductData();
329 assert(
nullptr != phb);
330 phb->unsafe_deleteProduct();
361 std::shared_ptr<ProcessHistory const> inputProcessHistory;
364 auto noDel =[](
void const*){};
365 inputProcessHistory =
366 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
367 if (inputProcessHistory.get() ==
nullptr) {
369 <<
"Principal::fillPrincipal\n" 370 <<
"Input ProcessHistory not found in registry\n" 371 <<
"Contact a Framework developer\n";
375 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
382 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
387 iter != iEnd; ++iter) {
388 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
389 if (nameIter == lookupProcessNames.end()) {
418 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
419 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
420 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
448 <<
"addProductOrThrow: Problem found while adding product, " 449 <<
"product already exists for (" 516 bool skipCurrentProcess,
522 assert(0!=productResolver.get());
523 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
524 if(resolution.isAmbiguous()) {
528 auto productData = resolution.data();
529 if(productData ==
nullptr) {
532 return BasicHandle(productData->wrapper(), &(productData->provenance()));
538 bool skipCurrentProcess,
541 assert(0!=productResolver.get());
542 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,
nullptr,mcc);
552 assert(results.empty());
555 failedToRegisterConsumesMany(typeID);
591 std::vector<ProductResolverBase const*> holders;
598 if(!holders.empty()) {
605 assert(productResolver);
606 holders.push_back(productResolver);
610 if(!holders.empty()) {
625 iter != iEnd; ++iter) {
627 for (
auto productResolver : holders) {
636 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
661 if (skipCurrentProcess) {
669 inputTag.
label().c_str(),
682 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),
689 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
720 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
725 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
752 if(phb->unscheduledWasNotRun()) {
753 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
757 return *phb->provenance();
766 for(
auto const& productResolver : *
this) {
767 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
770 if(productResolver->provenance()->branchDescription().present()) {
771 provenances.push_back(productResolver->provenance());
783 for(
auto const& productResolver : *
this) {
784 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
785 if(productResolver->stableProvenance()->branchDescription().present()) {
786 provenances.push_back(productResolver->stableProvenance());
794 for(
auto&
prod : bids) {
818 std::vector<WrapperBase const*>&,
819 std::vector<unsigned int>&)
const {
830 if(edp.get() ==
nullptr) {
832 <<
"put: Cannot put because unique_ptr to product is null." 846 for(
auto const&
prod :
preg_->productList()) {
854 auto cbd = std::make_shared<BranchDescription const>(bd);
865 if(not
reader()) {
return;}
867 for(
auto &
prod : *
this) {
868 prod->retrieveAndMerge(*
this);
874 for(
auto &
prod : *
this) {
875 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