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),
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 bool productMadeAtEnd =
false;
209 for(
unsigned int i=0;
i< matchingHolders.size();++
i) {
210 if( (not ambiguous[
i]) and
212 productResolvers_[matchingHolders[
i]]->branchDescription().availableOnlyAtEndTransition()) {
213 productMadeAtEnd =
true;
217 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous, productMadeAtEnd);
221 ambiguous.assign(lookupProcessNames.size(),
false);
225 productResolverIndex = product.
index();
228 auto iter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(),
process);
229 assert(iter != lookupProcessNames.end());
231 lastMatchIndex = iMatchingIndex;
235 assert(
k >= beginElements);
236 ambiguous.at(iter - lookupProcessNames.begin()) =
true;
238 matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
244 bool productMadeAtEnd =
false;
245 for(
unsigned int i=0;
i< matchingHolders.size();++
i) {
246 if( (not ambiguous[
i]) and
248 productResolvers_[matchingHolders[
i]]->branchDescription().availableOnlyAtEndTransition()) {
249 productMadeAtEnd =
true;
253 std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous, productMadeAtEnd);
267 for(
auto const&
prod : *
this) {
268 if(
prod->singleProduct() &&
269 !
prod->productUnavailable() &&
270 !
prod->unscheduledWasNotRun() &&
271 !
prod->branchDescription().dropped()) {
282 for(
auto const&
prod : prodsList) {
285 auto cbd = std::make_shared<BranchDescription const>(bd);
287 if(phb ==
nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
298 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
304 auto phb = std::make_unique<PuttableProductResolver>(
std::move(bd));
338 for(
auto&
prod : *
this) {
339 prod->resetProductData();
346 assert(
nullptr != phb);
347 phb->unsafe_deleteProduct();
373 processHistoryRegistry. getMapped(hist),
380 std::shared_ptr<ProcessHistory const> inputProcessHistory;
384 auto noDel =[](
void const*){};
385 inputProcessHistory =
386 std::shared_ptr<ProcessHistory const>(processHistoryRegistry.
getMapped(hist),noDel);
387 if (inputProcessHistory.get() ==
nullptr) {
389 <<
"Principal::fillPrincipal\n" 390 <<
"Input ProcessHistory not found in registry\n" 391 <<
"Contact a Framework developer\n";
395 inputProcessHistory = std::shared_ptr<ProcessHistory const>(&
s_emptyProcessHistory,[](
void const*){});
400 processHistoryPtr_ = inputProcessHistory;
406 std::vector<std::string>
const& lookupProcessNames =
productLookup_->lookupProcessNames();
419 if (nameIter != lookupProcessNames.end()) {
432 auto nameIter =
std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
433 if (nameIter == lookupProcessNames.end()) {
462 throw cms::Exception(
"HashCollision") <<
"Principal::getExistingProduct\n" <<
463 " Branch " << newProduct.
branchName() <<
" has same branch ID as branch " << existing.
branchName() <<
"\n" <<
464 "Workaround: change process name or product instance name of " << newProduct.
branchName() <<
"\n";
492 <<
"addProductOrThrow: Problem found while adding product, " 493 <<
"product already exists for (" 528 if(result ==
nullptr) {
548 if(result ==
nullptr) {
560 bool skipCurrentProcess,
566 assert(
nullptr!=productResolver.get());
567 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
568 if(resolution.isAmbiguous()) {
572 auto productData = resolution.data();
573 if(productData ==
nullptr) {
576 return BasicHandle(productData->wrapper(), &(productData->provenance()));
582 bool skipCurrentProcess,
586 assert(
nullptr!=productResolver.get());
587 productResolver->prefetchAsync(task,*
this, skipCurrentProcess,token,
nullptr,mcc);
597 assert(results.empty());
600 failedToRegisterConsumesMany(typeID);
636 std::vector<ProductResolverBase const*> holders;
643 if(!holders.empty()) {
650 assert(productResolver);
651 holders.push_back(productResolver);
655 if(!holders.empty()) {
670 iter != iEnd; ++iter) {
672 for (
auto productResolver : holders) {
681 ProductData const* productData = productResolver->resolveProduct(*
this,
false, sra, mcc).data();
706 if (skipCurrentProcess) {
714 inputTag.
label().c_str(),
727 failedToRegisterConsumes(kindOfType,typeID,inputTag.
label(),inputTag.
instance(),
734 auto resolution = productResolver->resolveProduct(*
this, skipCurrentProcess, sra, mcc);
765 failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
770 auto resolution = productResolver->resolveProduct(*
this,
false, sra, mcc);
797 if(phb->unscheduledWasNotRun()) {
798 if(not phb->resolveProduct(*
this,
false,
nullptr, mcc).data() ) {
802 return *phb->provenance();
811 for(
auto const& productResolver : *
this) {
812 if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
815 if(productResolver->provenance()->branchDescription().present()) {
816 provenances.push_back(productResolver->provenance());
828 for(
auto const& productResolver : *
this) {
829 if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
830 if(productResolver->stableProvenance()->branchDescription().present()) {
831 provenances.push_back(productResolver->stableProvenance());
839 for(
auto&
prod : bids) {
863 std::vector<WrapperBase const*>&,
864 std::vector<unsigned int>&)
const {
875 if(edp.get() ==
nullptr) {
877 <<
"put: Cannot put because unique_ptr to product is null." 891 for(
auto const&
prod :
preg_->productList()) {
899 auto cbd = std::make_shared<BranchDescription const>(bd);
910 if(not
reader()) {
return;}
912 for(
auto &
prod : *
this) {
913 prod->retrieveAndMerge(*
this);
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 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 prefetchAsync(WaitingTask *waitTask, ProductResolverIndex index, bool skipCurrentProcess, ServiceToken const &token, ModuleCallingContext const *mcc) const
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
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
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