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
 
virtual ~Principal ()
 
- 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
 
virtual WrapperBase const * getIt (ProductID const &) const override
 
virtual WrapperBase const * getThinnedProduct (ProductID const &, unsigned int &) const override
 
virtual 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_
 
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 100 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.

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

Definition at line 225 of file Principal.cc.

225  {
226  }

Member Function Documentation

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

Definition at line 286 of file Principal.cc.

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

Referenced by Principal().

286  {
287  ProductResolverIndex index = preg_->indexFrom(bd->originalBranchID());
288  assert(index != ProductResolverIndexInvalid);
289 
290  addProductOrThrow(std::make_unique<AliasProductResolver>(std::move(bd), dynamic_cast<ProducedProductResolver&>(*productResolvers_[index])));
291  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:431
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addInputProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 276 of file Principal.cc.

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

Referenced by adjustIndexesAfterProductRegistryAddition(), and Principal().

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

Definition at line 294 of file Principal.cc.

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

Referenced by Principal().

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

Definition at line 417 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().

417  {
418  BranchDescription const& bd = productResolver->branchDescription();
419  assert (!bd.className().empty());
420  assert (!bd.friendlyClassName().empty());
421  assert (!bd.moduleLabel().empty());
422  assert (!bd.processName().empty());
423  SharedProductPtr phb(productResolver.release());
424 
425  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
426  assert(index != ProductResolverIndexInvalid);
427  productResolvers_[index] = phb;
428  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
std::shared_ptr< ProductResolverBase > SharedProductPtr
Definition: Principal.h:67
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
void edm::Principal::addProductOrThrow ( std::unique_ptr< ProductResolverBase phb)
protected

Definition at line 431 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().

431  {
432  ProductResolverBase const* phb = getExistingProduct(*productResolver);
433  if(phb != nullptr) {
434  BranchDescription const& bd = productResolver->branchDescription();
435  throw Exception(errors::InsertFailure, "AlreadyPresent")
436  << "addProductOrThrow: Problem found while adding product, "
437  << "product already exists for ("
438  << bd.friendlyClassName() << ","
439  << bd.moduleLabel() << ","
440  << bd.productInstanceName() << ","
441  << bd.processName()
442  << ")\n";
443  }
444  addProduct_(std::move(productResolver));
445  }
void addProduct_(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:417
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addScheduledProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 264 of file Principal.cc.

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

Referenced by Principal().

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

Definition at line 270 of file Principal.cc.

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

Referenced by Principal().

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

Definition at line 281 of file Principal.cc.

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

Referenced by Principal().

281  {
282  addProductOrThrow(std::make_unique<UnscheduledProductResolver>(std::move(bd)));
283  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:431
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::adjustIndexesAfterProductRegistryAddition ( )

Definition at line 825 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().

825  {
826  if(preg_->getNextIndexValue(branchType_) != productResolvers_.size()) {
827  productResolvers_.resize(preg_->getNextIndexValue(branchType_));
828  for(auto const& prod : preg_->productList()) {
829  BranchDescription const& bd = prod.second;
830  if(bd.branchType() == branchType_) {
831  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
832  assert(index != ProductResolverIndexInvalid);
833  if(!productResolvers_[index]) {
834  // no product holder. Must add one. The new entry must be an input product holder.
835  assert(!bd.produced());
836  auto cbd = std::make_shared<BranchDescription const>(bd);
837  addInputProduct(cbd);
838  }
839  }
840  }
841  }
842  assert(preg_->getNextIndexValue(branchType_) == productResolvers_.size());
843  }
BranchType branchType_
Definition: Principal.h:286
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
void addInputProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:276
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
bool edm::Principal::adjustToNewProductRegistry ( ProductRegistry const &  reg)

Definition at line 247 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().

247  {
248  ProductRegistry::ProductList const& prodsList = reg.productList();
249  for(auto const& prod : prodsList) {
250  BranchDescription const& bd = prod.second;
251  if(!bd.produced() && (bd.branchType() == branchType_)) {
252  auto cbd = std::make_shared<BranchDescription const>(bd);
253  auto phb = getExistingProduct(cbd->branchID());
254  if(phb == nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
255  return false;
256  }
257  phb->resetBranchDescription(cbd);
258  }
259  }
260  return true;
261  }
BranchType branchType_
Definition: Principal.h:286
std::map< BranchKey, BranchDescription > ProductList
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
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:272
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:272
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:272
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:293
void edm::Principal::clearPrincipal ( )

Definition at line 300 of file Principal.cc.

References processHistoryID_, processHistoryPtr_, parseEventContent::prod, and reader_.

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

300  {
301  processHistoryPtr_.reset();
303  reader_ = nullptr;
304  for(auto& prod : *this) {
305  prod->resetProductData();
306  }
307  }
DelayedReader * reader_
Definition: Principal.h:284
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
ProcessHistoryID processHistoryID_
Definition: Principal.h:267
Hash< ProcessHistoryType > ProcessHistoryID
void edm::Principal::deleteProduct ( BranchID const &  id) const

Definition at line 315 of file Principal.cc.

References getExistingProduct().

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

315  {
316  auto phb = getExistingProduct(id);
317  assert(nullptr != phb);
318  phb->unsafe_deleteProduct();
319  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
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:272
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:272
void edm::Principal::fillPrincipal ( ProcessHistoryID const &  hist,
ProcessHistoryRegistry const &  phr,
DelayedReader reader 
)

Definition at line 331 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_, processHistoryPtr_, productLookup_, productRegistry(), reader(), reader_, and edm::s_emptyProcessHistory.

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

333  {
334  //increment identifier here since clearPrincipal isn't called for Run/Lumi
336  atEndTransition_=false;
337  if(reader) {
338  reader_ = reader;
339  }
340 
341  if (historyAppender_ && productRegistry().anyProductProduced()) {
343  historyAppender_->appendToProcessHistory(hist,
344  processHistoryRegistry.getMapped(hist),
347  }
348  else {
349  std::shared_ptr<ProcessHistory const> inputProcessHistory;
350  if (hist.isValid()) {
351  //does not own the pointer
352  auto noDel =[](void const*){};
353  inputProcessHistory =
354  std::shared_ptr<ProcessHistory const>(processHistoryRegistry.getMapped(hist),noDel);
355  if (inputProcessHistory.get() == nullptr) {
357  << "Principal::fillPrincipal\n"
358  << "Input ProcessHistory not found in registry\n"
359  << "Contact a Framework developer\n";
360  }
361  } else {
362  //Since this is static we don't want it deleted
363  inputProcessHistory = std::shared_ptr<ProcessHistory const>(&s_emptyProcessHistory,[](void const*){});
364  }
366  processHistoryPtr_ = inputProcessHistory;
367  }
368 
370  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
371  lookupProcessOrder_.assign(lookupProcessNames.size(), 0);
372  unsigned int k = 0;
373  for (auto iter = processHistoryPtr_->rbegin(),
374  iEnd = processHistoryPtr_->rend();
375  iter != iEnd; ++iter) {
376  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
377  if (nameIter == lookupProcessNames.end()) {
378  continue;
379  }
380  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
381  ++k;
382  }
384  }
385  }
static ProcessHistory const s_emptyProcessHistory
Definition: Principal.cc:32
ProductRegistry const & productRegistry() const
Definition: Principal.h:151
DelayedReader * reader_
Definition: Principal.h:284
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
static Principal::CacheIdentifier_t nextIdentifier()
Definition: Principal.cc:96
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:291
std::vector< unsigned int > lookupProcessOrder_
Definition: Principal.h:279
std::shared_ptr< ProductResolverIndexHelper const > productLookup_
Definition: Principal.h:277
CacheIdentifier_t cacheIdentifier_
Definition: Principal.h:293
ProcessHistoryID orderProcessHistoryID_
Definition: Principal.h:280
int k[5][pyjets_maxn]
DelayedReader * reader() const
Definition: Principal.h:184
bool atEndTransition_
Definition: Principal.h:295
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:269
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 634 of file Principal.cc.

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

Referenced by findProductByTag(), and getByLabel().

639  {
640 
641  bool skipCurrentProcess = inputTag.willSkipCurrentProcess();
642 
644 
645  if (index == ProductResolverIndexInvalid) {
646 
647  char const* processName = inputTag.process().c_str();
648  if (skipCurrentProcess) {
649  processName = "\0";
650  }
651 
652  index = productLookup().index(kindOfType,
653  typeID,
654  inputTag.label().c_str(),
655  inputTag.instance().c_str(),
656  processName);
657 
658  if(index == ProductResolverIndexAmbiguous) {
659  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(), inputTag.process());
660  } else if (index == ProductResolverIndexInvalid) {
661  return 0;
662  }
663  inputTag.tryToCacheIndex(index, typeID, branchType(), &productRegistry());
664  }
665  if(unlikely( consumer and (not consumer->registeredToConsume(index, skipCurrentProcess, branchType())))) {
666  failedToRegisterConsumes(kindOfType,typeID,inputTag.label(),inputTag.instance(),inputTag.process());
667  }
668 
669 
670  auto const& productResolver = productResolvers_[index];
671 
672  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
673  if(resolution.isAmbiguous()) {
674  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(), inputTag.process());
675  }
676  return resolution.data();
677  }
ProductRegistry const & productRegistry() const
Definition: Principal.h:151
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
static void throwAmbiguousException(const char *where, TypeID const &productType, std::string const &label, std::string const &instance, std::string const &process)
Definition: Principal.cc:60
#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=0) 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 680 of file Principal.cc.

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

687  {
688 
690  typeID,
691  label.c_str(),
692  instance.c_str(),
693  process.c_str());
694 
695  if(index == ProductResolverIndexAmbiguous) {
696  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
697  } else if (index == ProductResolverIndexInvalid) {
698  return 0;
699  }
700 
701  if(unlikely( consumer and (not consumer->registeredToConsume(index, false, branchType())))) {
702  failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
703  }
704 
705  auto const& productResolver = productResolvers_[index];
706 
707  auto resolution = productResolver->resolveProduct(*this, false, sra, mcc);
708  if(resolution.isAmbiguous()) {
709  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
710  }
711  return resolution.data();
712  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
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:60
#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=0) const
ProductData const * edm::Principal::findProductByTag ( TypeID const &  typeID,
InputTag const &  tag,
ModuleCallingContext const *  mcc 
) const

Definition at line 715 of file Principal.cc.

References findProductByLabel(), and edm::PRODUCT_TYPE.

Referenced by edm::getProductByTag().

715  {
716  ProductData const* productData =
718  typeID,
719  tag,
720  nullptr,
721  nullptr,
722  mcc);
723  return productData;
724  }
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:634
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 604 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().

608  {
609 
610  for (auto iter = processHistoryPtr_->rbegin(),
611  iEnd = processHistoryPtr_->rend();
612  iter != iEnd; ++iter) {
613  std::string const& process = iter->processName();
614  for (auto productResolver : holders) {
615  BranchDescription const& bd = productResolver->branchDescription();
616  if (process == bd.processName()) {
617 
618  // Ignore aliases to avoid matching the same product multiple times.
619  if(bd.isAlias()) {
620  continue;
621  }
622 
623  ProductData const* productData = productResolver->resolveProduct(*this,false, sra, mcc).data();
624  if(productData) {
625  // Skip product if not available.
626  results.emplace_back(productData->wrapper(), &(productData->provenance()));
627  }
628  }
629  }
630  }
631  }
std::shared_ptr< ProcessHistory const > processHistoryPtr_
Definition: Principal.h:265
void edm::Principal::getAllProvenance ( std::vector< Provenance const * > &  provenances) const

Definition at line 746 of file Principal.cc.

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

746  {
747  provenances.clear();
748  for(auto const& productResolver : *this) {
749  if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
750  // We do not attempt to get the event/lumi/run status from the provenance,
751  // because the per event provenance may have been dropped.
752  if(productResolver->provenance()->branchDescription().present()) {
753  provenances.push_back(productResolver->provenance());
754  }
755  }
756  }
757  }
void edm::Principal::getAllStableProvenance ( std::vector< StableProvenance const * > &  provenances) const

Definition at line 763 of file Principal.cc.

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

763  {
764  provenances.clear();
765  for(auto const& productResolver : *this) {
766  if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
767  if(productResolver->stableProvenance()->branchDescription().present()) {
768  provenances.push_back(productResolver->stableProvenance());
769  }
770  }
771  }
772  }
BasicHandle edm::Principal::getByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
InputTag const &  inputTag,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 464 of file Principal.cc.

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

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

469  {
470 
471  ProductData const* result = findProductByLabel(kindOfType, typeID, inputTag, consumer, sra, mcc);
472  if(result == 0) {
473  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
474  return makeNotFoundException("getByLabel", kindOfType, typeID, inputTag.label(), inputTag.instance(), inputTag.process());
475  }));
476  }
477  return BasicHandle(result->wrapper(), &(result->provenance()));
478  }
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:43
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:634
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 481 of file Principal.cc.

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

488  {
489 
490  ProductData const* result = findProductByLabel(kindOfType, typeID, label, instance, process,consumer, sra, mcc);
491  if(result == 0) {
492  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
493  return makeNotFoundException("getByLabel", kindOfType, typeID, label, instance, process);
494  }));
495  }
496  return BasicHandle(result->wrapper(), &(result->provenance()));
497  }
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:43
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:634
BasicHandle edm::Principal::getByToken ( KindOfType  kindOfType,
TypeID const &  typeID,
ProductResolverIndex  index,
bool  skipCurrentProcess,
bool &  ambiguous,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 500 of file Principal.cc.

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

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

506  {
508  auto& productResolver = productResolvers_[index];
509  assert(0!=productResolver.get());
510  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
511  if(resolution.isAmbiguous()) {
512  ambiguous = true;
513  return BasicHandle();
514  }
515  auto productData = resolution.data();
516  if(productData == nullptr) {
517  return BasicHandle();
518  }
519  return BasicHandle(productData->wrapper(), &(productData->provenance()));
520  }
ProductResolverCollection productResolvers_
Definition: Principal.h:272
ProductResolverBase * edm::Principal::getExistingProduct ( BranchID const &  branchID)
protected

Definition at line 388 of file Principal.cc.

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

388  {
389  return const_cast<ProductResolverBase*>( const_cast<const Principal*>(this)->getExistingProduct(branchID));
390  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
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:100
ProductResolverBase const * edm::Principal::getExistingProduct ( BranchID const &  branchID) const
protected

Definition at line 393 of file Principal.cc.

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

393  {
394  ProductResolverIndex index = preg_->indexFrom(branchID);
395  assert(index != ProductResolverIndexInvalid);
396  return productResolvers_.at(index).get();
397  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
ProductResolverBase const * edm::Principal::getExistingProduct ( ProductResolverBase const &  phb) const
protected

Definition at line 400 of file Principal.cc.

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

400  {
401  auto phb = getExistingProduct(productResolver.branchDescription().branchID());
402  if(nullptr != phb && BranchKey(productResolver.branchDescription()) != BranchKey(phb->branchDescription())) {
403  BranchDescription const& newProduct = phb->branchDescription();
404  BranchDescription const& existing = productResolver.branchDescription();
405  if(newProduct.branchName() != existing.branchName() && newProduct.branchID() == existing.branchID()) {
406  throw cms::Exception("HashCollision") << "Principal::getExistingProduct\n" <<
407  " Branch " << newProduct.branchName() << " has same branch ID as branch " << existing.branchName() << "\n" <<
408  "Workaround: change process name or product instance name of " << newProduct.branchName() << "\n";
409  } else {
410  assert(nullptr == phb || BranchKey(productResolver.branchDescription()) == BranchKey(phb->branchDescription()));
411  }
412  }
413  return phb;
414  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
BranchDescription const & branchDescription() const
WrapperBase const * edm::Principal::getIt ( ProductID const &  ) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Reimplemented in edm::EventPrincipal.

Definition at line 787 of file Principal.cc.

787  {
788  assert(false);
789  return nullptr;
790  }
void edm::Principal::getManyByType ( TypeID const &  typeID,
BasicHandleVec results,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 533 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_().

537  {
538 
539  assert(results.empty());
540 
541  if(unlikely(consumer and (not consumer->registeredToConsumeMany(typeID,branchType())))) {
542  failedToRegisterConsumesMany(typeID);
543  }
544 
545  // This finds the indexes to all the ProductResolver's matching the type
546  ProductResolverIndexHelper::Matches matches =
548 
549  if (matches.numberOfMatches() == 0) {
550  return;
551  }
552 
553  results.reserve(matches.numberOfMatches());
554 
555  // Loop over the ProductResolvers. Add the products that are actually
556  // present into the results. This will also trigger delayed reading,
557  // on demand production, and check for deleted products as appropriate.
558 
559  // Over the years the code that uses getManyByType has grown to depend
560  // on the ordering of the results. The order originally was just an
561  // accident of how previous versions of the code were written, but
562  // here we have to go through some extra effort to preserve that ordering.
563 
564  // We build a list of holders that match a particular label and instance.
565  // When that list is complete we call findProducts, which loops over
566  // that list in reverse order of the ProcessHistory (starts with the
567  // most recent). Then we clear the list and repeat this until all the
568  // matching label and instance subsets have been dealt with.
569 
570  // Note that the function isFullyResolved returns true for the ProductResolvers
571  // that are associated with an empty process name. Those are the ones that
572  // know how to search for the most recent process name matching
573  // a label and instance. We do not need these for getManyByType and
574  // skip them. In addition to skipping them, we make use of the fact
575  // that they mark the beginning of each subset of holders with the same
576  // label and instance. They tell us when to call findProducts.
577 
578  std::vector<ProductResolverBase const*> holders;
579 
580  for(unsigned int i = 0; i < matches.numberOfMatches(); ++i) {
581 
582  ProductResolverIndex index = matches.index(i);
583 
584  if(!matches.isFullyResolved(i)) {
585  if(!holders.empty()) {
586  // Process the ones with a particular module label and instance
587  findProducts(holders, typeID, results, sra, mcc);
588  holders.clear();
589  }
590  } else {
591  ProductResolverBase const* productResolver = productResolvers_.at(index).get();
592  assert(productResolver);
593  holders.push_back(productResolver);
594  }
595  }
596  // Do not miss the last subset of products
597  if(!holders.empty()) {
598  findProducts(holders, typeID, results, sra, mcc);
599  }
600  return;
601  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
#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:604
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:100
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:448
Principal::ConstProductResolverPtr edm::Principal::getProductResolver ( BranchID const &  oid) const

Definition at line 448 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().

448  {
449  ProductResolverIndex index = preg_->indexFrom(bid);
450  if(index == ProductResolverIndexInvalid){
451  return ConstProductResolverPtr();
452  }
453  return getProductResolverByIndex(index);
454  }
unsigned int ProductResolverIndex
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
ConstProductResolverPtr getProductResolverByIndex(ProductResolverIndex const &oid) const
Definition: Principal.cc:457
Principal::ConstProductResolverPtr edm::Principal::getProductResolverByIndex ( ProductResolverIndex const &  oid) const
Provenance edm::Principal::getProvenance ( BranchID const &  bid,
ModuleCallingContext const *  mcc 
) const

Definition at line 727 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().

728  {
730  if(phb == nullptr) {
732  }
733 
734  if(phb->unscheduledWasNotRun()) {
735  if(not phb->resolveProduct(*this,false, nullptr, mcc).data() ) {
736  throwProductNotFoundException("getProvenance(onDemand)", errors::ProductNotFound, bid);
737  }
738  }
739  return *phb->provenance();
740  }
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:448
static void throwProductNotFoundException(char const *where, errors::ErrorCodes error, BranchID const &bid)
Definition: Principal.cc:36
WrapperBase const * edm::Principal::getThinnedProduct ( ProductID const &  ,
unsigned int &   
) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Reimplemented in edm::EventPrincipal.

Definition at line 793 of file Principal.cc.

793  {
794  assert(false);
795  return nullptr;
796  }
void edm::Principal::getThinnedProducts ( ProductID const &  ,
std::vector< WrapperBase const * > &  ,
std::vector< unsigned int > &   
) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Reimplemented in edm::EventPrincipal.

Definition at line 799 of file Principal.cc.

801  {
802  assert(false);
803  }
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 523 of file Principal.cc.

References productResolvers_.

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

526  {
527  auto const& productResolver = productResolvers_.at(index);
528  assert(0!=productResolver.get());
529  productResolver->prefetchAsync(task,*this, skipCurrentProcess,nullptr,mcc);
530  }
ProductResolverCollection productResolvers_
Definition: Principal.h:272
ProcessConfiguration const& edm::Principal::processConfiguration ( ) const
inline

Definition at line 149 of file Principal.h.

149 {return *processConfiguration_;}
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:269
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:277
ProductRegistry const& edm::Principal::productRegistry ( ) const
inline

Definition at line 151 of file Principal.h.

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

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

Definition at line 811 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().

811  {
812  if(edp.get() == nullptr) {
813  throw edm::Exception(edm::errors::InsertFailure,"Null Pointer")
814  << "put: Cannot put because unique_ptr to product is null."
815  << "\n";
816  }
817  auto phb = getExistingProduct(bd.branchID());
818  assert(phb);
819  // ProductResolver assumes ownership
820  putOrMerge(std::move(edp), phb);
821  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:388
void putOrMerge(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
Definition: Principal.cc:811
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 806 of file Principal.cc.

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

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

Definition at line 846 of file Principal.cc.

References parseEventContent::prod, and reader().

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

846  {
847  if(not reader()) {return;}
848 
849  for(auto & prod : *this) {
850  prod->retrieveAndMerge(*this);
851  }
852  }
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 775 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_().

775  {
776  for(auto& prod : bids) {
777  ProductResolverIndex index= preg_->indexFrom(prod);
778  assert(index!=ProductResolverIndexInvalid);
779  ProductResolverIndex indexO = other.preg_->indexFrom(prod);
780  assert(indexO!=ProductResolverIndexInvalid);
781  get_underlying_safe(productResolvers_[index]).swap(get_underlying_safe(other.productResolvers_[indexO]));
782  }
783  reader_->mergeReaders(other.reader());
784  }
DelayedReader * reader_
Definition: Principal.h:284
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
void mergeReaders(DelayedReader *other)
Definition: DelayedReader.h:35
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
std::shared_ptr< T > & get_underlying_safe(propagate_const< std::shared_ptr< T >> &iP)
void edm::Principal::resetFailedFromThisProcess ( )

Definition at line 855 of file Principal.cc.

References parseEventContent::prod.

855  {
856  for( auto & prod : *this) {
857  prod->resetFailedFromThisProcess();
858  }
859  }
void edm::Principal::setAtEndTransition ( bool  iAtEnd)
void edm::Principal::setupUnscheduled ( UnscheduledConfigurator const &  iConfigure)

Definition at line 322 of file Principal.cc.

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

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

322  {
323  applyToResolvers([&iConfigure](ProductResolverBase* iResolver) {
324  iResolver->setupUnscheduled(iConfigure);
325  });
326  }
void applyToResolvers(F iFunc)
Definition: Principal.h:217
size_t edm::Principal::size ( void  ) const

Definition at line 232 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().

232  {
233  size_t size = 0U;
234  for(auto const& prod : *this) {
235  if(prod->singleProduct() && // Not a NoProcessProductResolver
236  !prod->productUnavailable() &&
237  !prod->unscheduledWasNotRun() &&
238  !prod->branchDescription().dropped()) {
239  ++size;
240  }
241  }
242  return size;
243  }
size_t size() const
Definition: Principal.cc:232

Member Data Documentation

bool edm::Principal::atEndTransition_
private

Definition at line 295 of file Principal.h.

Referenced by fillPrincipal(), and setAtEndTransition().

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

Definition at line 293 of file Principal.h.

Referenced by fillPrincipal().

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

Definition at line 291 of file Principal.h.

Referenced by fillPrincipal().

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

Definition at line 279 of file Principal.h.

Referenced by fillPrincipal().

ProcessHistoryID edm::Principal::orderProcessHistoryID_
private

Definition at line 280 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 269 of file Principal.h.

Referenced by fillPrincipal().

ProcessHistoryID edm::Principal::processHistoryID_
private

Definition at line 267 of file Principal.h.

Referenced by clearPrincipal(), and fillPrincipal().

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

Definition at line 265 of file Principal.h.

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

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

Definition at line 277 of file Principal.h.

Referenced by fillPrincipal(), and Principal().

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

Definition at line 284 of file Principal.h.

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