CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes
edm::Principal Class Reference

#include <Principal.h>

Inheritance diagram for edm::Principal:
edm::EDProductGetter edm::EventPrincipal edm::LuminosityBlockPrincipal edm::RunPrincipal

Public Types

typedef std::vector< BasicHandleBasicHandleVec
 
typedef unsigned long CacheIdentifier_t
 
typedef boost::filter_iterator< FilledProductPtr, ProductResolverCollection::const_iterator > const_iterator
 
typedef ProductResolverBase const * ConstProductResolverPtr
 
typedef boost::filter_iterator< FilledProductPtr, ProductResolverCollection::iterator > iterator
 
typedef std::string ProcessName
 
typedef ProcessHistory::const_iterator ProcessNameConstIterator
 
typedef std::vector< propagate_const< std::shared_ptr< ProductResolverBase > > > ProductResolverCollection
 
typedef std::shared_ptr< ProductResolverBaseSharedProductPtr
 
typedef ProductResolverCollection::size_type size_type
 

Public Member Functions

void adjustIndexesAfterProductRegistryAddition ()
 
bool adjustToNewProductRegistry (ProductRegistry const &reg)
 
bool atEndTransition () const
 
const_iterator begin () const
 
iterator begin ()
 
BranchType const & branchType () const
 
CacheIdentifier_t cacheIdentifier () const
 
void clearPrincipal ()
 
void deleteProduct (BranchID const &id) const
 
const_iterator end () const
 
iterator end ()
 
void fillPrincipal (ProcessHistoryID const &hist, ProcessHistoryRegistry const &phr, DelayedReader *reader)
 
ProductData const * findProductByTag (TypeID const &typeID, InputTag const &tag, ModuleCallingContext const *mcc) const
 
void getAllProvenance (std::vector< Provenance const * > &provenances) const
 
void getAllStableProvenance (std::vector< StableProvenance const * > &provenances) const
 
BasicHandle getByLabel (KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
BasicHandle getByLabel (KindOfType kindOfType, TypeID const &typeID, std::string const &label, std::string const &instance, std::string const &process, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
BasicHandle getByToken (KindOfType kindOfType, TypeID const &typeID, ProductResolverIndex index, bool skipCurrentProcess, bool &ambiguous, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
void getManyByType (TypeID const &typeID, BasicHandleVec &results, EDConsumerBase const *consumes, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
ProductResolverBasegetModifiableProductResolver (BranchID const &oid)
 
ConstProductResolverPtr getProductResolver (BranchID const &oid) const
 
ConstProductResolverPtr getProductResolverByIndex (ProductResolverIndex const &oid) const
 
Provenance getProvenance (BranchID const &bid, ModuleCallingContext const *mcc) const
 
bool isComplete () const
 
std::vector< unsigned int > const & lookupProcessOrder () const
 
void prefetchAsync (WaitingTask *waitTask, ProductResolverIndex index, bool skipCurrentProcess, ModuleCallingContext const *mcc) const
 
 Principal (std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< ProductResolverIndexHelper const > productLookup, ProcessConfiguration const &pc, BranchType bt, HistoryAppender *historyAppender, bool isForPrimaryProcess=true)
 
ProcessConfiguration const & processConfiguration () const
 
ProcessHistory const & processHistory () const
 
ProcessHistoryID const & processHistoryID () const
 
EDProductGetter const * prodGetter () const
 
ProductResolverIndexHelper const & productLookup () const
 
ProductRegistry const & productRegistry () const
 
void readAllFromSourceAndMergeImmediately ()
 
DelayedReaderreader () const
 
void recombine (Principal &other, std::vector< BranchID > const &bids)
 
void resetFailedFromThisProcess ()
 
void setAtEndTransition (bool iAtEnd)
 
void setupUnscheduled (UnscheduledConfigurator const &)
 
size_t size () const
 
 ~Principal () override
 
- Public Member Functions inherited from edm::EDProductGetter
 EDProductGetter ()
 
 EDProductGetter (EDProductGetter const &)=delete
 
EDProductGetter const & operator= (EDProductGetter const &)=delete
 
unsigned int transitionIndex () const
 
virtual ~EDProductGetter ()
 

Protected Member Functions

void addProduct_ (std::unique_ptr< ProductResolverBase > phb)
 
void addProductOrThrow (std::unique_ptr< ProductResolverBase > phb)
 
template<typename F >
void applyToResolvers (F iFunc)
 
ProductResolverBasegetExistingProduct (BranchID const &branchID)
 
ProductResolverBase const * getExistingProduct (BranchID const &branchID) const
 
ProductResolverBase const * getExistingProduct (ProductResolverBase const &phb) const
 
void putOrMerge (BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
 

Private Member Functions

void addAliasedProduct (std::shared_ptr< BranchDescription const > bd)
 
void addInputProduct (std::shared_ptr< BranchDescription const > bd)
 
void addParentProcessProduct (std::shared_ptr< BranchDescription const > bd)
 
void addScheduledProduct (std::shared_ptr< BranchDescription const > bd)
 
void addSourceProduct (std::shared_ptr< BranchDescription const > bd)
 
void addUnscheduledProduct (std::shared_ptr< BranchDescription const > bd)
 
ProductData const * findProductByLabel (KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
ProductData const * findProductByLabel (KindOfType kindOfType, TypeID const &typeID, std::string const &label, std::string const &instance, std::string const &process, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
void findProducts (std::vector< ProductResolverBase const * > const &holders, TypeID const &typeID, BasicHandleVec &results, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
 
WrapperBase const * getIt (ProductID const &) const override
 
WrapperBase const * getThinnedProduct (ProductID const &, unsigned int &) const override
 
void getThinnedProducts (ProductID const &, std::vector< WrapperBase const * > &, std::vector< unsigned int > &) const override
 
virtual bool isComplete_ () const
 
void putOrMerge (std::unique_ptr< WrapperBase > prod, ProductResolverBase const *productResolver) const
 

Private Attributes

bool atEndTransition_
 
BranchType branchType_
 
CacheIdentifier_t cacheIdentifier_
 
edm::propagate_const< HistoryAppender * > historyAppender_
 
std::vector< unsigned int > lookupProcessOrder_
 
ProcessHistoryID orderProcessHistoryID_
 
std::shared_ptr< ProductRegistry const > preg_
 
ProcessConfiguration const * processConfiguration_
 
ProcessHistoryID processHistoryID_
 
ProcessHistoryID processHistoryIDBeforeConfig_
 
std::shared_ptr< ProcessHistory const > processHistoryPtr_
 
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
 
ProductResolverCollection productResolvers_
 
DelayedReaderreader_
 

Additional Inherited Members

- Static Public Member Functions inherited from edm::EDProductGetter
static void assignEDProductGetter (EDProductGetter const *&)
 
static EDProductGetter const * switchProductGetter (EDProductGetter const *)
 These can only be used internally by the framework. More...
 

Detailed Description

Definition at line 57 of file Principal.h.

Member Typedef Documentation

Definition at line 64 of file Principal.h.

typedef unsigned long edm::Principal::CacheIdentifier_t

Definition at line 181 of file Principal.h.

typedef boost::filter_iterator<FilledProductPtr, ProductResolverCollection::const_iterator> edm::Principal::const_iterator

Definition at line 60 of file Principal.h.

Definition at line 63 of file Principal.h.

typedef boost::filter_iterator<FilledProductPtr, ProductResolverCollection::iterator> edm::Principal::iterator

Definition at line 61 of file Principal.h.

typedef std::string edm::Principal::ProcessName

Definition at line 68 of file Principal.h.

Definition at line 62 of file Principal.h.

Definition at line 59 of file Principal.h.

Definition at line 67 of file Principal.h.

typedef ProductResolverCollection::size_type edm::Principal::size_type

Definition at line 65 of file Principal.h.

Constructor & Destructor Documentation

edm::Principal::Principal ( std::shared_ptr< ProductRegistry const >  reg,
std::shared_ptr< ProductResolverIndexHelper const >  productLookup,
ProcessConfiguration const &  pc,
BranchType  bt,
HistoryAppender historyAppender,
bool  isForPrimaryProcess = true 
)

Definition at line 113 of file Principal.cc.

References addAliasedProduct(), addInputProduct(), addParentProcessProduct(), addScheduledProduct(), addSourceProduct(), addUnscheduledProduct(), edm::ProductResolverIndexHelper::Range::begin(), edm::BranchDescription::branchType(), branchType_, edm::ProductResolverIndexHelper::Range::end(), spr::find(), mps_fire::i, edm::ProductResolverIndexHelper::IndexAndNames::index(), edm::InEvent, edm::BranchDescription::isAlias(), gen::k, edm::BranchDescription::moduleLabel(), edm::BranchDescription::onDemand(), or, LaserDQM_cfg::process, edm::ProcessConfiguration::processName(), edm::BranchDescription::processName(), parseEventContent::prod, edm::BranchDescription::produced(), productLookup_, edm::ProductResolverIndexAmbiguous, edm::ProductResolverIndexInvalid, productResolvers_, diffTwoXMLs::ranges, edm::source(), edm::ProductResolverIndexHelper::IndexAndNames::startInProcessNames(), and AlCaHLTBitMon_QueryRunRegistry::string.

118  :
119  EDProductGetter(),
125  preg_(reg),
128  reader_(),
129  branchType_(bt),
130  historyAppender_(historyAppender),
132  atEndTransition_(false)
133  {
134  productResolvers_.resize(reg->getNextIndexValue(bt));
135  //Now that these have been set, we can create the list of Branches we need.
136  std::string const source("source");
137  ProductRegistry::ProductList const& prodsList = reg->productList();
138  // The constructor of an alias product holder takes as an argument the product holder for which it is an alias.
139  // So, the non-alias product holders must be created first.
140  // Therefore, on this first pass, skip current EDAliases.
141  bool hasAliases = false;
142  for(auto const& prod : prodsList) {
143  BranchDescription const& bd = prod.second;
144  if(bd.branchType() == branchType_) {
145  if(isForPrimaryProcess or bd.processName() == pc.processName()) {
146  if(bd.isAlias()) {
147  hasAliases = true;
148  } else {
149  auto cbd = std::make_shared<BranchDescription const>(bd);
150  if(bd.produced()) {
151  if(bd.moduleLabel() == source) {
152  addSourceProduct(cbd);
153  } else if(bd.onDemand()) {
154  assert(branchType_ == InEvent);
156  } else {
157  addScheduledProduct(cbd);
158  }
159  } else {
160  addInputProduct(cbd);
161  }
162  }
163  } else {
164  //We are in a SubProcess and this branch is from the parent
165  auto cbd =std::make_shared<BranchDescription const>(bd);
167  }
168  }
169  }
170  // Now process any EDAliases
171  if(hasAliases) {
172  for(auto const& prod : prodsList) {
173  BranchDescription const& bd = prod.second;
174  if(bd.isAlias() && bd.branchType() == branchType_) {
175  auto cbd = std::make_shared<BranchDescription const>(bd);
176  addAliasedProduct(cbd);
177  }
178  }
179  }
180 
181  // Now create the ProductResolvers that search in reverse process
182  // order and are used for queries where the process name is the
183  // empty string
184  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
185  std::vector<ProductResolverIndex> matchingHolders(lookupProcessNames.size(), ProductResolverIndexInvalid);
186  std::vector<bool> ambiguous(lookupProcessNames.size(), false);
187  unsigned int beginElements = productLookup_->beginElements();
188  std::vector<TypeID> const& sortedTypeIDs = productLookup_->sortedTypeIDs();
189  std::vector<ProductResolverIndexHelper::Range> const& ranges = productLookup_->ranges();
190  std::vector<ProductResolverIndexHelper::IndexAndNames> const& indexAndNames = productLookup_->indexAndNames();
191  std::vector<char> const& processNamesCharArray = productLookup_->processNames();
192 
193  unsigned int numberOfMatches = 0;
195  if (!sortedTypeIDs.empty()) {
196  ProductResolverIndex productResolverIndex = ProductResolverIndexInvalid;
197  for(unsigned int k = 0, kEnd = sortedTypeIDs.size(); k < kEnd; ++k) {
198  ProductResolverIndexHelper::Range const& range = ranges.at(k);
199  for (unsigned int i = range.begin(); i < range.end(); ++i) {
200  ProductResolverIndexHelper::IndexAndNames const& product = indexAndNames.at(i);
201  if (product.startInProcessNames() == 0) {
202  if (productResolverIndex != ProductResolverIndexInvalid) {
203  if ((numberOfMatches == 1) and
204  (lastMatchIndex != ProductResolverIndexAmbiguous)) {
205  //only one choice so use a special resolver
206  productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
207  } else {
208  std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
209  productResolvers_.at(productResolverIndex) = newHolder;
210  }
211  matchingHolders.assign(lookupProcessNames.size(), ProductResolverIndexInvalid);
212  ambiguous.assign(lookupProcessNames.size(), false);
213  numberOfMatches= 0;
214  lastMatchIndex = ProductResolverIndexInvalid;
215  }
216  productResolverIndex = product.index();
217  } else {
218  std::string process(&processNamesCharArray.at(product.startInProcessNames()));
219  auto iter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), process);
220  assert(iter != lookupProcessNames.end());
221  ProductResolverIndex iMatchingIndex = product.index();
222  lastMatchIndex = iMatchingIndex;
223  assert(iMatchingIndex != ProductResolverIndexInvalid);
224  ++numberOfMatches;
225  if (iMatchingIndex == ProductResolverIndexAmbiguous) {
226  assert(k >= beginElements);
227  ambiguous.at(iter - lookupProcessNames.begin()) = true;
228  } else {
229  matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
230  }
231  }
232  }
233  }
234  std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
235  productResolvers_.at(productResolverIndex) = newHolder;
236  }
237  }
BranchType branchType_
Definition: Principal.h:287
DelayedReader * reader_
Definition: Principal.h:285
ProcessHistoryID processHistoryIDBeforeConfig_
Definition: Principal.h:268
unsigned int ProductResolverIndex
static std::string const source("source")
ProductResolverCollection productResolvers_
Definition: Principal.h:273
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
std::map< BranchKey, BranchDescription > ProductList
static Principal::CacheIdentifier_t nextIdentifier()
Definition: Principal.cc:109
ProcessHistoryID processHistoryID_
Definition: Principal.h:267
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
void addInputProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:290
edm::propagate_const< HistoryAppender * > historyAppender_
Definition: Principal.h:292
std::vector< unsigned int > lookupProcessOrder_
Definition: Principal.h:280
void addScheduledProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:278
PixelRecoRange< float > Range
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
Definition: Principal.h:278
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
CacheIdentifier_t cacheIdentifier_
Definition: Principal.h:294
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
Definition: Activities.doc:12
void addSourceProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:284
void addParentProcessProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:308
int k[5][pyjets_maxn]
string ranges
Definition: diffTwoXMLs.py:78
void addUnscheduledProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:295
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:153
void addAliasedProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:300
bool atEndTransition_
Definition: Principal.h:296
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:270
std::vector< std::string > const & lookupProcessNames() const
edm::Principal::~Principal ( )
override

Definition at line 239 of file Principal.cc.

239  {
240  }

Member Function Documentation

void edm::Principal::addAliasedProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 300 of file Principal.cc.

References addProductOrThrow(), diffTreeTool::index, eostools::move(), preg_, edm::ProductResolverIndexInvalid, and productResolvers_.

Referenced by Principal().

300  {
301  ProductResolverIndex index = preg_->indexFrom(bd->originalBranchID());
302  assert(index != ProductResolverIndexInvalid);
303 
304  addProductOrThrow(std::make_unique<AliasProductResolver>(std::move(bd), dynamic_cast<ProducedProductResolver&>(*productResolvers_[index])));
305  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addInputProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 290 of file Principal.cc.

References addProductOrThrow(), and eostools::move().

Referenced by adjustIndexesAfterProductRegistryAddition(), and Principal().

290  {
291  addProductOrThrow(std::make_unique<InputProductResolver>(std::move(bd)));
292  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addParentProcessProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 308 of file Principal.cc.

References addProductOrThrow(), and eostools::move().

Referenced by Principal().

308  {
309  addProductOrThrow(std::make_unique<ParentProcessProductResolver>(std::move(bd)));
310  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addProduct_ ( std::unique_ptr< ProductResolverBase phb)
protected

Definition at line 458 of file Principal.cc.

References edm::BranchDescription::branchID(), edm::BranchDescription::className(), edm::BranchDescription::friendlyClassName(), diffTreeTool::index, edm::BranchDescription::moduleLabel(), preg_, edm::BranchDescription::processName(), edm::ProductResolverIndexInvalid, and productResolvers_.

Referenced by addProductOrThrow().

458  {
459  BranchDescription const& bd = productResolver->branchDescription();
460  assert (!bd.className().empty());
461  assert (!bd.friendlyClassName().empty());
462  assert (!bd.moduleLabel().empty());
463  assert (!bd.processName().empty());
464  SharedProductPtr phb(productResolver.release());
465 
466  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
467  assert(index != ProductResolverIndexInvalid);
468  productResolvers_[index] = phb;
469  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
std::shared_ptr< ProductResolverBase > SharedProductPtr
Definition: Principal.h:67
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
void edm::Principal::addProductOrThrow ( std::unique_ptr< ProductResolverBase phb)
protected

Definition at line 472 of file Principal.cc.

References addProduct_(), Exception, edm::BranchDescription::friendlyClassName(), getExistingProduct(), edm::errors::InsertFailure, edm::BranchDescription::moduleLabel(), eostools::move(), edm::BranchDescription::processName(), and edm::BranchDescription::productInstanceName().

Referenced by addAliasedProduct(), addInputProduct(), addParentProcessProduct(), addScheduledProduct(), addSourceProduct(), and addUnscheduledProduct().

472  {
473  ProductResolverBase const* phb = getExistingProduct(*productResolver);
474  if(phb != nullptr) {
475  BranchDescription const& bd = productResolver->branchDescription();
476  throw Exception(errors::InsertFailure, "AlreadyPresent")
477  << "addProductOrThrow: Problem found while adding product, "
478  << "product already exists for ("
479  << bd.friendlyClassName() << ","
480  << bd.moduleLabel() << ","
481  << bd.productInstanceName() << ","
482  << bd.processName()
483  << ")\n";
484  }
485  addProduct_(std::move(productResolver));
486  }
void addProduct_(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:458
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addScheduledProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 278 of file Principal.cc.

References addProductOrThrow(), and eostools::move().

Referenced by Principal().

278  {
279  auto phb = std::make_unique<PuttableProductResolver>(std::move(bd));
281  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addSourceProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 284 of file Principal.cc.

References addProductOrThrow(), and eostools::move().

Referenced by Principal().

284  {
285  auto phb = std::make_unique<PuttableProductResolver>(std::move(bd));
287  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addUnscheduledProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 295 of file Principal.cc.

References addProductOrThrow(), and eostools::move().

Referenced by Principal().

295  {
296  addProductOrThrow(std::make_unique<UnscheduledProductResolver>(std::move(bd)));
297  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:472
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::adjustIndexesAfterProductRegistryAddition ( )

Definition at line 872 of file Principal.cc.

References addInputProduct(), edm::BranchDescription::branchID(), edm::BranchDescription::branchType(), branchType_, diffTreeTool::index, preg_, parseEventContent::prod, edm::BranchDescription::produced(), edm::ProductResolverIndexInvalid, and productResolvers_.

Referenced by edm::PrincipalCache::adjustEventsToNewProductRegistry(), and edm::StreamerInputSource::read().

872  {
873  if(preg_->getNextIndexValue(branchType_) != productResolvers_.size()) {
874  productResolvers_.resize(preg_->getNextIndexValue(branchType_));
875  for(auto const& prod : preg_->productList()) {
876  BranchDescription const& bd = prod.second;
877  if(bd.branchType() == branchType_) {
878  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
879  assert(index != ProductResolverIndexInvalid);
880  if(!productResolvers_[index]) {
881  // no product holder. Must add one. The new entry must be an input product holder.
882  assert(!bd.produced());
883  auto cbd = std::make_shared<BranchDescription const>(bd);
884  addInputProduct(cbd);
885  }
886  }
887  }
888  }
889  assert(preg_->getNextIndexValue(branchType_) == productResolvers_.size());
890  }
BranchType branchType_
Definition: Principal.h:287
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
void addInputProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:290
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
bool edm::Principal::adjustToNewProductRegistry ( ProductRegistry const &  reg)

Definition at line 261 of file Principal.cc.

References edm::BranchDescription::branchType(), branchType_, getExistingProduct(), parseEventContent::prod, edm::BranchDescription::produced(), edm::ProductRegistry::productList(), and edm::ProductResolverBase::resetBranchDescription().

Referenced by edm::PrincipalCache::adjustEventsToNewProductRegistry(), and edm::StreamerInputSource::read().

261  {
262  ProductRegistry::ProductList const& prodsList = reg.productList();
263  for(auto const& prod : prodsList) {
264  BranchDescription const& bd = prod.second;
265  if(!bd.produced() && (bd.branchType() == branchType_)) {
266  auto cbd = std::make_shared<BranchDescription const>(bd);
267  auto phb = getExistingProduct(cbd->branchID());
268  if(phb == nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
269  return false;
270  }
271  phb->resetBranchDescription(cbd);
272  }
273  }
274  return true;
275  }
BranchType branchType_
Definition: Principal.h:287
std::map< BranchKey, BranchDescription > ProductList
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
void resetBranchDescription(std::shared_ptr< BranchDescription const > bd)
template<typename F >
void edm::Principal::applyToResolvers ( F  iFunc)
inlineprotected

Definition at line 217 of file Principal.h.

References edm::getThinnedProduct(), and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by setupUnscheduled().

217  {
218  for(auto& resolver: productResolvers_) {
219  iFunc(resolver.get());
220  }
221  }
ProductResolverCollection productResolvers_
Definition: Principal.h:273
bool edm::Principal::atEndTransition ( ) const
inline
const_iterator edm::Principal::begin ( void  ) const
inline

Definition at line 165 of file Principal.h.

165 {return boost::make_filter_iterator<FilledProductPtr>(productResolvers_.begin(), productResolvers_.end());}
ProductResolverCollection productResolvers_
Definition: Principal.h:273
iterator edm::Principal::begin ( void  )
inline

Definition at line 168 of file Principal.h.

168 {return boost::make_filter_iterator<FilledProductPtr>(productResolvers_.begin(), productResolvers_.end());}
ProductResolverCollection productResolvers_
Definition: Principal.h:273
BranchType const& edm::Principal::branchType ( ) const
inline
CacheIdentifier_t edm::Principal::cacheIdentifier ( ) const
inline

Definition at line 182 of file Principal.h.

Referenced by edm::LuminosityBlock::cacheIdentifier(), edm::Run::cacheIdentifier(), and edm::Event::cacheIdentifier().

182 {return cacheIdentifier_;}
CacheIdentifier_t cacheIdentifier_
Definition: Principal.h:294
void edm::Principal::clearPrincipal ( )

Definition at line 314 of file Principal.cc.

References parseEventContent::prod, and reader_.

Referenced by edm::EventPrincipal::clearEventPrincipal(), and edm::PoolSource::readEvent_().

314  {
315  //We do not clear the product history information
316  // because it rarely changes and recalculating takes
317  // time.
318  reader_ = nullptr;
319  for(auto& prod : *this) {
320  prod->resetProductData();
321  }
322  }
DelayedReader * reader_
Definition: Principal.h:285
void edm::Principal::deleteProduct ( BranchID const &  id) const

Definition at line 330 of file Principal.cc.

References getExistingProduct().

Referenced by edm::EarlyDeleteHelper::moduleRan().

330  {
331  auto phb = getExistingProduct(id);
332  assert(nullptr != phb);
333  phb->unsafe_deleteProduct();
334  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
const_iterator edm::Principal::end ( void  ) const
inline

Definition at line 166 of file Principal.h.

Referenced by Types.LuminosityBlockRange::cppID(), and Types.EventRange::cppID().

166 {return boost::make_filter_iterator<FilledProductPtr>(productResolvers_.end(), productResolvers_.end());}
ProductResolverCollection productResolvers_
Definition: Principal.h:273
iterator edm::Principal::end ( void  )
inline

Definition at line 169 of file Principal.h.

Referenced by Types.LuminosityBlockRange::cppID(), and Types.EventRange::cppID().

169 {return boost::make_filter_iterator<FilledProductPtr>(productResolvers_.end(), productResolvers_.end());}
ProductResolverCollection productResolvers_
Definition: Principal.h:273
void edm::Principal::fillPrincipal ( ProcessHistoryID const &  hist,
ProcessHistoryRegistry const &  phr,
DelayedReader reader 
)

Definition at line 346 of file Principal.cc.

References atEndTransition_, cacheIdentifier_, Exception, spr::find(), edm::ProcessHistoryRegistry::getMapped(), create_public_lumi_plots::hist, historyAppender_, edm::Hash< I >::isValid(), gen::k, edm::errors::LogicError, lookupProcessOrder_, edm::nextIdentifier(), orderProcessHistoryID_, processConfiguration_, processHistoryID_, processHistoryIDBeforeConfig_, processHistoryPtr_, edm::ProcessConfiguration::processName(), productLookup_, productRegistry(), reader(), reader_, and edm::s_emptyProcessHistory.

Referenced by edm::EventPrincipal::fillEventPrincipal(), edm::LuminosityBlockPrincipal::fillLuminosityBlockPrincipal(), and edm::RunPrincipal::fillRunPrincipal().

348  {
349  //increment identifier here since clearPrincipal isn't called for Run/Lumi
351  atEndTransition_=false;
352  if(reader) {
353  reader_ = reader;
354  }
355 
356  if (historyAppender_ && productRegistry().anyProductProduced()) {
358  processHistoryPtr_ =
359  historyAppender_->appendToProcessHistory(hist,
360  processHistoryRegistry. getMapped(hist),
362  processHistoryID_ = processHistoryPtr_->id();
364  }
365  }
366  else {
367  std::shared_ptr<ProcessHistory const> inputProcessHistory;
368  if( (not processHistoryPtr_) || (processHistoryIDBeforeConfig_ != hist) ) {
369  if (hist.isValid()) {
370  //does not own the pointer
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";
379  }
380  } else {
381  //Since this is static we don't want it deleted
382  inputProcessHistory = std::shared_ptr<ProcessHistory const>(&s_emptyProcessHistory,[](void const*){});
383  }
385  processHistoryPtr_ = inputProcessHistory;
387  }
388  }
389 
391  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
392  lookupProcessOrder_.assign(lookupProcessNames.size(), 0);
393  unsigned int k = 0;
394 
395  // We loop over processes in reverse order of the ProcessHistory.
396  // If any entries in the product lookup tables are associated with
397  // the process we add it to the vector of processes in the order
398  // the lookup should be performed. There is one exception though,
399  // We start with the current process even if it is not in the ProcessHistory.
400  // The current process might be needed but not be in the process
401  // history if all the products produced in the current process are
402  // transient.
403  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), processConfiguration_->processName());
404  if (nameIter != lookupProcessNames.end()) {
405  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
406  ++k;
407  }
408 
409  // We just looked for the current process so skip it if
410  // it is in the ProcessHistory.
411  auto iter = processHistoryPtr_->rbegin();
412  if (iter->processName() == processConfiguration_->processName()) {
413  ++iter;
414  }
415 
416  for (auto iEnd = processHistoryPtr_->rend(); iter != iEnd; ++iter) {
417  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
418  if (nameIter == lookupProcessNames.end()) {
419  continue;
420  }
421  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
422  ++k;
423  }
425  }
426  }
static ProcessHistory const s_emptyProcessHistory
Definition: Principal.cc:33
ProductRegistry const & productRegistry() const
Definition: Principal.h:151
DelayedReader * reader_
Definition: Principal.h:285
ProcessHistoryID processHistoryIDBeforeConfig_
Definition: Principal.h:268
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
static Principal::CacheIdentifier_t nextIdentifier()
Definition: Principal.cc:109
ProcessHistoryID processHistoryID_
Definition: Principal.h:267
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
edm::propagate_const< HistoryAppender * > historyAppender_
Definition: Principal.h:292
std::string const & processName() const
std::vector< unsigned int > lookupProcessOrder_
Definition: Principal.h:280
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
Definition: Principal.h:278
CacheIdentifier_t cacheIdentifier_
Definition: Principal.h:294
ProcessHistoryID orderProcessHistoryID_
Definition: Principal.h:281
int k[5][pyjets_maxn]
DelayedReader * reader() const
Definition: Principal.h:184
bool atEndTransition_
Definition: Principal.h:296
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:270
ProductData const * edm::Principal::findProductByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
InputTag const &  inputTag,
EDConsumerBase const *  consumer,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const
private

Definition at line 676 of file Principal.cc.

References edm::appendCurrentProcessIfAlias(), branchType(), edm::ProductResolverIndexHelper::index(), diffTreeTool::index, edm::InputTag::indexFor(), edm::InputTag::instance(), edm::InputTag::kCurrentProcess, edm::InputTag::label(), edm::InputTag::process(), processConfiguration_, modifiedElectrons_cfi::processName, edm::ProcessConfiguration::processName(), productLookup(), productRegistry(), edm::ProductResolverIndexAmbiguous, edm::ProductResolverIndexInvalid, productResolvers_, edm::EDConsumerBase::registeredToConsume(), fftjetproducer_cfi::resolution, edm::throwAmbiguousException(), edm::InputTag::tryToCacheIndex(), unlikely, and edm::InputTag::willSkipCurrentProcess().

Referenced by findProductByTag(), and getByLabel().

681  {
682 
683  bool skipCurrentProcess = inputTag.willSkipCurrentProcess();
684 
686 
687  if (index == ProductResolverIndexInvalid) {
688 
689  char const* processName = inputTag.process().c_str();
690  if (skipCurrentProcess) {
691  processName = "\0";
692  } else if (inputTag.process() == InputTag::kCurrentProcess) {
693  processName = processConfiguration_->processName().c_str();
694  }
695 
696  index = productLookup().index(kindOfType,
697  typeID,
698  inputTag.label().c_str(),
699  inputTag.instance().c_str(),
700  processName);
701 
702  if(index == ProductResolverIndexAmbiguous) {
703  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(),
705  } else if (index == ProductResolverIndexInvalid) {
706  return nullptr;
707  }
708  inputTag.tryToCacheIndex(index, typeID, branchType(), &productRegistry());
709  }
710  if(unlikely( consumer and (not consumer->registeredToConsume(index, skipCurrentProcess, branchType())))) {
711  failedToRegisterConsumes(kindOfType,typeID,inputTag.label(),inputTag.instance(),
713  }
714 
715 
716  auto const& productResolver = productResolvers_[index];
717 
718  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
719  if(resolution.isAmbiguous()) {
720  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(),
722  }
723  return resolution.data();
724  }
ProductRegistry const & productRegistry() const
Definition: Principal.h:151
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
static void throwAmbiguousException(const char *where, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
Definition: Principal.cc:73
std::string const & processName() const
#define unlikely(x)
BranchType const & branchType() const
Definition: Principal.h:178
static const std::string kCurrentProcess
Definition: InputTag.h:51
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:153
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const &currentProcess)
Definition: Principal.cc:36
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:270
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=nullptr) const
ProductData const * edm::Principal::findProductByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
std::string const &  label,
std::string const &  instance,
std::string const &  process,
EDConsumerBase const *  consumer,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const
private

Definition at line 727 of file Principal.cc.

References branchType(), edm::ProductResolverIndexHelper::index(), diffTreeTool::index, productLookup(), edm::ProductResolverIndexAmbiguous, edm::ProductResolverIndexInvalid, productResolvers_, edm::EDConsumerBase::registeredToConsume(), fftjetproducer_cfi::resolution, edm::throwAmbiguousException(), and unlikely.

734  {
735 
737  typeID,
738  label.c_str(),
739  instance.c_str(),
740  process.c_str());
741 
742  if(index == ProductResolverIndexAmbiguous) {
743  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
744  } else if (index == ProductResolverIndexInvalid) {
745  return nullptr;
746  }
747 
748  if(unlikely( consumer and (not consumer->registeredToConsume(index, false, branchType())))) {
749  failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
750  }
751 
752  auto const& productResolver = productResolvers_[index];
753 
754  auto resolution = productResolver->resolveProduct(*this, false, sra, mcc);
755  if(resolution.isAmbiguous()) {
756  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
757  }
758  return resolution.data();
759  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
static PFTauRenderPlugin instance
static void throwAmbiguousException(const char *where, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
Definition: Principal.cc:73
#define unlikely(x)
BranchType const & branchType() const
Definition: Principal.h:178
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:153
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=nullptr) const
ProductData const * edm::Principal::findProductByTag ( TypeID const &  typeID,
InputTag const &  tag,
ModuleCallingContext const *  mcc 
) const

Definition at line 762 of file Principal.cc.

References findProductByLabel(), and edm::PRODUCT_TYPE.

Referenced by edm::getProductByTag().

762  {
763  ProductData const* productData =
765  typeID,
766  tag,
767  nullptr,
768  nullptr,
769  mcc);
770  return productData;
771  }
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:676
void edm::Principal::findProducts ( std::vector< ProductResolverBase const * > const &  holders,
TypeID const &  typeID,
BasicHandleVec results,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const
private

Definition at line 646 of file Principal.cc.

References edm::BranchDescription::isAlias(), LaserDQM_cfg::process, processHistoryPtr_, edm::BranchDescription::processName(), edm::ProductData::provenance(), AlCaHLTBitMon_QueryRunRegistry::string, and edm::ProductData::wrapper().

Referenced by getManyByType().

650  {
651 
652  for (auto iter = processHistoryPtr_->rbegin(),
653  iEnd = processHistoryPtr_->rend();
654  iter != iEnd; ++iter) {
655  std::string const& process = iter->processName();
656  for (auto productResolver : holders) {
657  BranchDescription const& bd = productResolver->branchDescription();
658  if (process == bd.processName()) {
659 
660  // Ignore aliases to avoid matching the same product multiple times.
661  if(bd.isAlias()) {
662  continue;
663  }
664 
665  ProductData const* productData = productResolver->resolveProduct(*this,false, sra, mcc).data();
666  if(productData) {
667  // Skip product if not available.
668  results.emplace_back(productData->wrapper(), &(productData->provenance()));
669  }
670  }
671  }
672  }
673  }
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
void edm::Principal::getAllProvenance ( std::vector< Provenance const * > &  provenances) const

Definition at line 793 of file Principal.cc.

Referenced by edm::OccurrenceForOutput::getAllProvenance(), and edm::Event::getAllProvenance().

793  {
794  provenances.clear();
795  for(auto const& productResolver : *this) {
796  if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
797  // We do not attempt to get the event/lumi/run status from the provenance,
798  // because the per event provenance may have been dropped.
799  if(productResolver->provenance()->branchDescription().present()) {
800  provenances.push_back(productResolver->provenance());
801  }
802  }
803  }
804  }
void edm::Principal::getAllStableProvenance ( std::vector< StableProvenance const * > &  provenances) const

Definition at line 810 of file Principal.cc.

Referenced by edm::OccurrenceForOutput::getAllStableProvenance(), edm::LuminosityBlock::getAllStableProvenance(), edm::Run::getAllStableProvenance(), and edm::Event::getAllStableProvenance().

810  {
811  provenances.clear();
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());
816  }
817  }
818  }
819  }
BasicHandle edm::Principal::getByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
InputTag const &  inputTag,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 505 of file Principal.cc.

References edm::appendCurrentProcessIfAlias(), findProductByLabel(), edm::InputTag::instance(), edm::InputTag::label(), edm::makeHandleExceptionFactory(), edm::makeNotFoundException(), edm::InputTag::process(), processConfiguration_, edm::ProcessConfiguration::processName(), edm::ProductData::provenance(), mps_fire::result, and edm::ProductData::wrapper().

Referenced by edm::PrincipalGetAdapter::getByLabel_(), and edm::PrincipalGetAdapter::getMatchingSequenceByLabel_().

510  {
511 
512  ProductData const* result = findProductByLabel(kindOfType, typeID, inputTag, consumer, sra, mcc);
513  if(result == nullptr) {
514  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
515  return makeNotFoundException("getByLabel", kindOfType, typeID, inputTag.label(), inputTag.instance(),
517  }));
518  }
519  return BasicHandle(result->wrapper(), &(result->provenance()));
520  }
std::string const & processName() const
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
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)
Definition: Principal.cc:56
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:676
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const &currentProcess)
Definition: Principal.cc:36
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:270
BasicHandle edm::Principal::getByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
std::string const &  label,
std::string const &  instance,
std::string const &  process,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 523 of file Principal.cc.

References findProductByLabel(), edm::makeHandleExceptionFactory(), edm::makeNotFoundException(), edm::ProductData::provenance(), mps_fire::result, and edm::ProductData::wrapper().

530  {
531 
532  ProductData const* result = findProductByLabel(kindOfType, typeID, label, instance, process,consumer, sra, mcc);
533  if(result == nullptr) {
534  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
535  return makeNotFoundException("getByLabel", kindOfType, typeID, label, instance, process);
536  }));
537  }
538  return BasicHandle(result->wrapper(), &(result->provenance()));
539  }
static PFTauRenderPlugin instance
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
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)
Definition: Principal.cc:56
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:676
BasicHandle edm::Principal::getByToken ( KindOfType  kindOfType,
TypeID const &  typeID,
ProductResolverIndex  index,
bool  skipCurrentProcess,
bool &  ambiguous,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 542 of file Principal.cc.

References diffTreeTool::index, edm::ProductResolverIndexInvalid, productResolvers_, and fftjetproducer_cfi::resolution.

Referenced by edm::PrincipalGetAdapter::getByToken_().

548  {
550  auto& productResolver = productResolvers_[index];
551  assert(nullptr!=productResolver.get());
552  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
553  if(resolution.isAmbiguous()) {
554  ambiguous = true;
555  return BasicHandle();
556  }
557  auto productData = resolution.data();
558  if(productData == nullptr) {
559  return BasicHandle();
560  }
561  return BasicHandle(productData->wrapper(), &(productData->provenance()));
562  }
ProductResolverCollection productResolvers_
Definition: Principal.h:273
ProductResolverBase * edm::Principal::getExistingProduct ( BranchID const &  branchID)
protected

Definition at line 429 of file Principal.cc.

Referenced by addProductOrThrow(), adjustToNewProductRegistry(), deleteProduct(), getExistingProduct(), edm::EventPrincipal::put(), edm::EventPrincipal::putOnRead(), and putOrMerge().

429  {
430  return const_cast<ProductResolverBase*>( const_cast<const Principal*>(this)->getExistingProduct(branchID));
431  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
Principal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< ProductResolverIndexHelper const > productLookup, ProcessConfiguration const &pc, BranchType bt, HistoryAppender *historyAppender, bool isForPrimaryProcess=true)
Definition: Principal.cc:113
ProductResolverBase const * edm::Principal::getExistingProduct ( BranchID const &  branchID) const
protected

Definition at line 434 of file Principal.cc.

References diffTreeTool::index, preg_, edm::ProductResolverIndexInvalid, and productResolvers_.

434  {
435  ProductResolverIndex index = preg_->indexFrom(branchID);
436  assert(index != ProductResolverIndexInvalid);
437  return productResolvers_.at(index).get();
438  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
ProductResolverBase const * edm::Principal::getExistingProduct ( ProductResolverBase const &  phb) const
protected

Definition at line 441 of file Principal.cc.

References edm::ProductResolverBase::branchDescription(), edm::BranchDescription::branchID(), edm::BranchDescription::branchName(), Exception, and getExistingProduct().

441  {
442  auto phb = getExistingProduct(productResolver.branchDescription().branchID());
443  if(nullptr != phb && BranchKey(productResolver.branchDescription()) != BranchKey(phb->branchDescription())) {
444  BranchDescription const& newProduct = phb->branchDescription();
445  BranchDescription const& existing = productResolver.branchDescription();
446  if(newProduct.branchName() != existing.branchName() && newProduct.branchID() == existing.branchID()) {
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";
450  } else {
451  assert(nullptr == phb || BranchKey(productResolver.branchDescription()) == BranchKey(phb->branchDescription()));
452  }
453  }
454  return phb;
455  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
BranchDescription const & branchDescription() const
WrapperBase const * edm::Principal::getIt ( ProductID const &  ) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Definition at line 834 of file Principal.cc.

834  {
835  assert(false);
836  return nullptr;
837  }
void edm::Principal::getManyByType ( TypeID const &  typeID,
BasicHandleVec results,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 575 of file Principal.cc.

References branchType(), findProducts(), mps_fire::i, edm::ProductResolverIndexHelper::Matches::index(), diffTreeTool::index, edm::ProductResolverIndexHelper::Matches::isFullyResolved(), patRefSel_triggerMatching_cfi::matches, edm::ProductResolverIndexHelper::Matches::numberOfMatches(), edm::PRODUCT_TYPE, productLookup(), productResolvers_, edm::EDConsumerBase::registeredToConsumeMany(), edm::ProductResolverIndexHelper::relatedIndexes(), and unlikely.

Referenced by edm::PrincipalGetAdapter::getManyByType_().

579  {
580 
581  assert(results.empty());
582 
583  if(unlikely(consumer and (not consumer->registeredToConsumeMany(typeID,branchType())))) {
584  failedToRegisterConsumesMany(typeID);
585  }
586 
587  // This finds the indexes to all the ProductResolver's matching the type
588  ProductResolverIndexHelper::Matches matches =
590 
591  if (matches.numberOfMatches() == 0) {
592  return;
593  }
594 
595  results.reserve(matches.numberOfMatches());
596 
597  // Loop over the ProductResolvers. Add the products that are actually
598  // present into the results. This will also trigger delayed reading,
599  // on demand production, and check for deleted products as appropriate.
600 
601  // Over the years the code that uses getManyByType has grown to depend
602  // on the ordering of the results. The order originally was just an
603  // accident of how previous versions of the code were written, but
604  // here we have to go through some extra effort to preserve that ordering.
605 
606  // We build a list of holders that match a particular label and instance.
607  // When that list is complete we call findProducts, which loops over
608  // that list in reverse order of the ProcessHistory (starts with the
609  // most recent). Then we clear the list and repeat this until all the
610  // matching label and instance subsets have been dealt with.
611 
612  // Note that the function isFullyResolved returns true for the ProductResolvers
613  // that are associated with an empty process name. Those are the ones that
614  // know how to search for the most recent process name matching
615  // a label and instance. We do not need these for getManyByType and
616  // skip them. In addition to skipping them, we make use of the fact
617  // that they mark the beginning of each subset of holders with the same
618  // label and instance. They tell us when to call findProducts.
619 
620  std::vector<ProductResolverBase const*> holders;
621 
622  for(unsigned int i = 0; i < matches.numberOfMatches(); ++i) {
623 
624  ProductResolverIndex index = matches.index(i);
625 
626  if(!matches.isFullyResolved(i)) {
627  if(!holders.empty()) {
628  // Process the ones with a particular module label and instance
629  findProducts(holders, typeID, results, sra, mcc);
630  holders.clear();
631  }
632  } else {
633  ProductResolverBase const* productResolver = productResolvers_.at(index).get();
634  assert(productResolver);
635  holders.push_back(productResolver);
636  }
637  }
638  // Do not miss the last subset of products
639  if(!holders.empty()) {
640  findProducts(holders, typeID, results, sra, mcc);
641  }
642  return;
643  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
#define unlikely(x)
BranchType const & branchType() const
Definition: Principal.h:178
Matches relatedIndexes(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance) const
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:153
void findProducts(std::vector< ProductResolverBase const * > const &holders, TypeID const &typeID, BasicHandleVec &results, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:646
ProductResolverBase* edm::Principal::getModifiableProductResolver ( BranchID const &  oid)
inline

Definition at line 158 of file Principal.h.

References findQualityFiles::size.

Referenced by edm::SubProcess::propagateProducts().

158  {
159  return const_cast<ProductResolverBase*>( const_cast<const Principal*>(this)->getProductResolver(oid));
160  }
Principal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< ProductResolverIndexHelper const > productLookup, ProcessConfiguration const &pc, BranchType bt, HistoryAppender *historyAppender, bool isForPrimaryProcess=true)
Definition: Principal.cc:113
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:489
Principal::ConstProductResolverPtr edm::Principal::getProductResolver ( BranchID const &  oid) const

Definition at line 489 of file Principal.cc.

References getProductResolverByIndex(), diffTreeTool::index, preg_, and edm::ProductResolverIndexInvalid.

Referenced by edm::EventPrincipal::getByProductID(), getProvenance(), edm::EventPrincipal::getThinnedAssociation(), and edm::SubProcess::propagateProducts().

489  {
490  ProductResolverIndex index = preg_->indexFrom(bid);
491  if(index == ProductResolverIndexInvalid){
492  return ConstProductResolverPtr();
493  }
494  return getProductResolverByIndex(index);
495  }
unsigned int ProductResolverIndex
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
ConstProductResolverPtr getProductResolverByIndex(ProductResolverIndex const &oid) const
Definition: Principal.cc:498
Principal::ConstProductResolverPtr edm::Principal::getProductResolverByIndex ( ProductResolverIndex const &  oid) const
Provenance edm::Principal::getProvenance ( BranchID const &  bid,
ModuleCallingContext const *  mcc 
) const

Definition at line 774 of file Principal.cc.

References getProductResolver(), edm::errors::ProductNotFound, and edm::throwProductNotFoundException().

Referenced by edm::OccurrenceForOutput::getProvenance(), edm::LuminosityBlock::getProvenance(), edm::Run::getProvenance(), edm::Event::getProvenance(), and edm::EventPrincipal::mergeProvenanceRetrievers().

775  {
777  if(phb == nullptr) {
779  }
780 
781  if(phb->unscheduledWasNotRun()) {
782  if(not phb->resolveProduct(*this,false, nullptr, mcc).data() ) {
783  throwProductNotFoundException("getProvenance(onDemand)", errors::ProductNotFound, bid);
784  }
785  }
786  return *phb->provenance();
787  }
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:489
static void throwProductNotFoundException(char const *where, errors::ErrorCodes error, BranchID const &bid)
Definition: Principal.cc:49
WrapperBase const * edm::Principal::getThinnedProduct ( ProductID const &  ,
unsigned int &   
) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Definition at line 840 of file Principal.cc.

840  {
841  assert(false);
842  return nullptr;
843  }
void edm::Principal::getThinnedProducts ( ProductID const &  ,
std::vector< WrapperBase const * > &  ,
std::vector< unsigned int > &   
) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Definition at line 846 of file Principal.cc.

848  {
849  assert(false);
850  }
bool edm::Principal::isComplete ( ) const
inline

Definition at line 200 of file Principal.h.

Referenced by edm::PrincipalGetAdapter::isComplete().

200 {return isComplete_();}
virtual bool isComplete_() const
Definition: Principal.h:261
virtual bool edm::Principal::isComplete_ ( ) const
inlineprivatevirtual

Reimplemented in edm::LuminosityBlockPrincipal, and edm::RunPrincipal.

Definition at line 261 of file Principal.h.

References parseEventContent::prod.

261 {return true;}
std::vector<unsigned int> const& edm::Principal::lookupProcessOrder ( ) const
inline
void edm::Principal::prefetchAsync ( WaitingTask waitTask,
ProductResolverIndex  index,
bool  skipCurrentProcess,
ModuleCallingContext const *  mcc 
) const

Definition at line 565 of file Principal.cc.

References productResolvers_.

Referenced by edm::Worker::prefetchAsync().

568  {
569  auto const& productResolver = productResolvers_.at(index);
570  assert(nullptr!=productResolver.get());
571  productResolver->prefetchAsync(task,*this, skipCurrentProcess,nullptr,mcc);
572  }
ProductResolverCollection productResolvers_
Definition: Principal.h:273
ProcessConfiguration const& edm::Principal::processConfiguration ( ) const
inline

Definition at line 149 of file Principal.h.

149 {return *processConfiguration_;}
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:270
ProcessHistory const& edm::Principal::processHistory ( ) const
inline
ProcessHistoryID const& edm::Principal::processHistoryID ( ) const
inline
EDProductGetter const* edm::Principal::prodGetter ( ) const
inline
ProductResolverIndexHelper const& edm::Principal::productLookup ( ) const
inline

Definition at line 153 of file Principal.h.

References trackingPlots::other.

Referenced by findProductByLabel(), edm::PrincipalGetAdapter::getBranchDescription(), and getManyByType().

153 {return *productLookup_;}
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
Definition: Principal.h:278
ProductRegistry const& edm::Principal::productRegistry ( ) const
inline

Definition at line 151 of file Principal.h.

Referenced by fillPrincipal(), findProductByLabel(), edm::SubProcess::processAsync(), and edm::PrincipalGetAdapter::throwUnregisteredPutException().

151 {return *preg_;}
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
void edm::Principal::putOrMerge ( BranchDescription const &  bd,
std::unique_ptr< WrapperBase edp 
) const
protected

Definition at line 858 of file Principal.cc.

References edm::BranchDescription::branchID(), Exception, getExistingProduct(), edm::errors::InsertFailure, and eostools::move().

Referenced by edm::RunPrincipal::put(), and edm::LuminosityBlockPrincipal::put().

858  {
859  if(edp.get() == nullptr) {
860  throw edm::Exception(edm::errors::InsertFailure,"Null Pointer")
861  << "put: Cannot put because unique_ptr to product is null."
862  << "\n";
863  }
864  auto phb = getExistingProduct(bd.branchID());
865  assert(phb);
866  // ProductResolver assumes ownership
867  putOrMerge(std::move(edp), phb);
868  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:429
void putOrMerge(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
Definition: Principal.cc:858
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::putOrMerge ( std::unique_ptr< WrapperBase prod,
ProductResolverBase const *  productResolver 
) const
private

Definition at line 853 of file Principal.cc.

References eostools::move(), and edm::ProductResolverBase::putOrMergeProduct().

853  {
854  phb->putOrMergeProduct(std::move(prod));
855  }
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::readAllFromSourceAndMergeImmediately ( )

Definition at line 893 of file Principal.cc.

References parseEventContent::prod, and reader().

Referenced by edm::RootFile::readLuminosityBlock_(), and edm::RootFile::readRun_().

893  {
894  if(not reader()) {return;}
895 
896  for(auto & prod : *this) {
897  prod->retrieveAndMerge(*this);
898  }
899  }
DelayedReader * reader() const
Definition: Principal.h:184
DelayedReader* edm::Principal::reader ( ) const
inline
void edm::Principal::recombine ( Principal other,
std::vector< BranchID > const &  bids 
)

Definition at line 822 of file Principal.cc.

References edm::get_underlying_safe(), diffTreeTool::index, edm::DelayedReader::mergeReaders(), preg_, parseEventContent::prod, edm::ProductResolverIndexInvalid, productResolvers_, reader(), and reader_.

Referenced by edm::PoolSource::readEvent_(), edm::PoolSource::readLuminosityBlock_(), and edm::PoolSource::readRun_().

822  {
823  for(auto& prod : bids) {
824  ProductResolverIndex index= preg_->indexFrom(prod);
825  assert(index!=ProductResolverIndexInvalid);
826  ProductResolverIndex indexO = other.preg_->indexFrom(prod);
827  assert(indexO!=ProductResolverIndexInvalid);
828  get_underlying_safe(productResolvers_[index]).swap(get_underlying_safe(other.productResolvers_[indexO]));
829  }
830  reader_->mergeReaders(other.reader());
831  }
DelayedReader * reader_
Definition: Principal.h:285
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:273
void mergeReaders(DelayedReader *other)
Definition: DelayedReader.h:35
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:277
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void edm::Principal::resetFailedFromThisProcess ( )

Definition at line 902 of file Principal.cc.

References parseEventContent::prod.

Referenced by edm::EventProcessor::endLumi(), and edm::EventProcessor::endRun().

902  {
903  for( auto & prod : *this) {
904  prod->resetFailedFromThisProcess();
905  }
906  }
void edm::Principal::setAtEndTransition ( bool  iAtEnd)
void edm::Principal::setupUnscheduled ( UnscheduledConfigurator const &  iConfigure)

Definition at line 337 of file Principal.cc.

References applyToResolvers(), and edm::ProductResolverBase::setupUnscheduled().

Referenced by edm::WorkerManager::setupOnDemandSystem().

337  {
338  applyToResolvers([&iConfigure](ProductResolverBase* iResolver) {
339  iResolver->setupUnscheduled(iConfigure);
340  });
341  }
void applyToResolvers(F iFunc)
Definition: Principal.h:217
size_t edm::Principal::size ( void  ) const

Definition at line 246 of file Principal.cc.

References parseEventContent::prod, and mitigatedMETSequence_cff::U.

Referenced by ntupleDataFormat._Collection::__iter__(), ntupleDataFormat._Collection::__len__(), edm::SecSourceAnalyzer::getBranches(), edm::StreamerInputSource::read(), edm::OccurrenceForOutput::size(), and edm::Event::size().

246  {
247  size_t size = 0U;
248  for(auto const& prod : *this) {
249  if(prod->singleProduct() && // Not a NoProcessProductResolver
250  !prod->productUnavailable() &&
251  !prod->unscheduledWasNotRun() &&
252  !prod->branchDescription().dropped()) {
253  ++size;
254  }
255  }
256  return size;
257  }
size_t size() const
Definition: Principal.cc:246

Member Data Documentation

bool edm::Principal::atEndTransition_
private

Definition at line 296 of file Principal.h.

Referenced by fillPrincipal(), and setAtEndTransition().

BranchType edm::Principal::branchType_
private
CacheIdentifier_t edm::Principal::cacheIdentifier_
private

Definition at line 294 of file Principal.h.

Referenced by fillPrincipal().

edm::propagate_const<HistoryAppender*> edm::Principal::historyAppender_
private

Definition at line 292 of file Principal.h.

Referenced by fillPrincipal().

std::vector<unsigned int> edm::Principal::lookupProcessOrder_
private

Definition at line 280 of file Principal.h.

Referenced by fillPrincipal().

ProcessHistoryID edm::Principal::orderProcessHistoryID_
private

Definition at line 281 of file Principal.h.

Referenced by fillPrincipal().

std::shared_ptr<ProductRegistry const> edm::Principal::preg_
private
ProcessConfiguration const* edm::Principal::processConfiguration_
private

Definition at line 270 of file Principal.h.

Referenced by fillPrincipal(), findProductByLabel(), and getByLabel().

ProcessHistoryID edm::Principal::processHistoryID_
private

Definition at line 267 of file Principal.h.

Referenced by fillPrincipal().

ProcessHistoryID edm::Principal::processHistoryIDBeforeConfig_
private

Definition at line 268 of file Principal.h.

Referenced by fillPrincipal().

std::shared_ptr<ProcessHistory const> edm::Principal::processHistoryPtr_
private

Definition at line 265 of file Principal.h.

Referenced by fillPrincipal(), and findProducts().

std::shared_ptr<ProductResolverIndexHelper const> edm::Principal::productLookup_
private

Definition at line 278 of file Principal.h.

Referenced by fillPrincipal(), and Principal().

ProductResolverCollection edm::Principal::productResolvers_
private
DelayedReader* edm::Principal::reader_
private

Definition at line 285 of file Principal.h.

Referenced by clearPrincipal(), fillPrincipal(), and recombine().