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 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(),
124  preg_(reg),
127  reader_(),
128  branchType_(bt),
129  historyAppender_(historyAppender),
131  atEndTransition_(false)
132  {
133  productResolvers_.resize(reg->getNextIndexValue(bt));
134  //Now that these have been set, we can create the list of Branches we need.
135  std::string const source("source");
136  ProductRegistry::ProductList const& prodsList = reg->productList();
137  // The constructor of an alias product holder takes as an argument the product holder for which it is an alias.
138  // So, the non-alias product holders must be created first.
139  // Therefore, on this first pass, skip current EDAliases.
140  bool hasAliases = false;
141  for(auto const& prod : prodsList) {
142  BranchDescription const& bd = prod.second;
143  if(bd.branchType() == branchType_) {
144  if(isForPrimaryProcess or bd.processName() == pc.processName()) {
145  if(bd.isAlias()) {
146  hasAliases = true;
147  } else {
148  auto cbd = std::make_shared<BranchDescription const>(bd);
149  if(bd.produced()) {
150  if(bd.moduleLabel() == source) {
151  addSourceProduct(cbd);
152  } else if(bd.onDemand()) {
153  assert(branchType_ == InEvent);
155  } else {
156  addScheduledProduct(cbd);
157  }
158  } else {
159  addInputProduct(cbd);
160  }
161  }
162  } else {
163  //We are in a SubProcess and this branch is from the parent
164  auto cbd =std::make_shared<BranchDescription const>(bd);
166  }
167  }
168  }
169  // Now process any EDAliases
170  if(hasAliases) {
171  for(auto const& prod : prodsList) {
172  BranchDescription const& bd = prod.second;
173  if(bd.isAlias() && bd.branchType() == branchType_) {
174  auto cbd = std::make_shared<BranchDescription const>(bd);
175  addAliasedProduct(cbd);
176  }
177  }
178  }
179 
180  // Now create the ProductResolvers that search in reverse process
181  // order and are used for queries where the process name is the
182  // empty string
183  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
184  std::vector<ProductResolverIndex> matchingHolders(lookupProcessNames.size(), ProductResolverIndexInvalid);
185  std::vector<bool> ambiguous(lookupProcessNames.size(), false);
186  unsigned int beginElements = productLookup_->beginElements();
187  std::vector<TypeID> const& sortedTypeIDs = productLookup_->sortedTypeIDs();
188  std::vector<ProductResolverIndexHelper::Range> const& ranges = productLookup_->ranges();
189  std::vector<ProductResolverIndexHelper::IndexAndNames> const& indexAndNames = productLookup_->indexAndNames();
190  std::vector<char> const& processNamesCharArray = productLookup_->processNames();
191 
192  unsigned int numberOfMatches = 0;
194  if (!sortedTypeIDs.empty()) {
195  ProductResolverIndex productResolverIndex = ProductResolverIndexInvalid;
196  for(unsigned int k = 0, kEnd = sortedTypeIDs.size(); k < kEnd; ++k) {
197  ProductResolverIndexHelper::Range const& range = ranges.at(k);
198  for (unsigned int i = range.begin(); i < range.end(); ++i) {
199  ProductResolverIndexHelper::IndexAndNames const& product = indexAndNames.at(i);
200  if (product.startInProcessNames() == 0) {
201  if (productResolverIndex != ProductResolverIndexInvalid) {
202  if ((numberOfMatches == 1) and
203  (lastMatchIndex != ProductResolverIndexAmbiguous)) {
204  //only one choice so use a special resolver
205  productResolvers_.at(productResolverIndex) = std::make_shared<SingleChoiceNoProcessProductResolver>(lastMatchIndex);
206  } else {
207  std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
208  productResolvers_.at(productResolverIndex) = newHolder;
209  }
210  matchingHolders.assign(lookupProcessNames.size(), ProductResolverIndexInvalid);
211  ambiguous.assign(lookupProcessNames.size(), false);
212  numberOfMatches= 0;
213  lastMatchIndex = ProductResolverIndexInvalid;
214  }
215  productResolverIndex = product.index();
216  } else {
217  std::string process(&processNamesCharArray.at(product.startInProcessNames()));
218  auto iter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), process);
219  assert(iter != lookupProcessNames.end());
220  ProductResolverIndex iMatchingIndex = product.index();
221  lastMatchIndex = iMatchingIndex;
222  assert(iMatchingIndex != ProductResolverIndexInvalid);
223  ++numberOfMatches;
224  if (iMatchingIndex == ProductResolverIndexAmbiguous) {
225  assert(k >= beginElements);
226  ambiguous.at(iter - lookupProcessNames.begin()) = true;
227  } else {
228  matchingHolders.at(iter - lookupProcessNames.begin()) = iMatchingIndex;
229  }
230  }
231  }
232  }
233  std::shared_ptr<ProductResolverBase> newHolder = std::make_shared<NoProcessProductResolver>(matchingHolders, ambiguous);
234  productResolvers_.at(productResolverIndex) = newHolder;
235  }
236  }
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: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:289
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:277
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:283
void addParentProcessProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:307
int k[5][pyjets_maxn]
string ranges
Definition: diffTwoXMLs.py:78
void addUnscheduledProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:294
ProductResolverIndexHelper const & productLookup() const
Definition: Principal.h:153
void addAliasedProduct(std::shared_ptr< BranchDescription const > bd)
Definition: Principal.cc:299
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 238 of file Principal.cc.

238  {
239  }

Member Function Documentation

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

Definition at line 299 of file Principal.cc.

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

Referenced by Principal().

299  {
300  ProductResolverIndex index = preg_->indexFrom(bd->originalBranchID());
301  assert(index != ProductResolverIndexInvalid);
302 
303  addProductOrThrow(std::make_unique<AliasProductResolver>(std::move(bd), dynamic_cast<ProducedProductResolver&>(*productResolvers_[index])));
304  }
unsigned int ProductResolverIndex
ProductResolverCollection productResolvers_
Definition: Principal.h:272
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:464
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 289 of file Principal.cc.

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

Referenced by adjustIndexesAfterProductRegistryAddition(), and Principal().

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

Definition at line 307 of file Principal.cc.

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

Referenced by Principal().

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

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

450  {
451  BranchDescription const& bd = productResolver->branchDescription();
452  assert (!bd.className().empty());
453  assert (!bd.friendlyClassName().empty());
454  assert (!bd.moduleLabel().empty());
455  assert (!bd.processName().empty());
456  SharedProductPtr phb(productResolver.release());
457 
458  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
459  assert(index != ProductResolverIndexInvalid);
460  productResolvers_[index] = phb;
461  }
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 464 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().

464  {
465  ProductResolverBase const* phb = getExistingProduct(*productResolver);
466  if(phb != nullptr) {
467  BranchDescription const& bd = productResolver->branchDescription();
468  throw Exception(errors::InsertFailure, "AlreadyPresent")
469  << "addProductOrThrow: Problem found while adding product, "
470  << "product already exists for ("
471  << bd.friendlyClassName() << ","
472  << bd.moduleLabel() << ","
473  << bd.productInstanceName() << ","
474  << bd.processName()
475  << ")\n";
476  }
477  addProduct_(std::move(productResolver));
478  }
void addProduct_(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:450
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addScheduledProduct ( std::shared_ptr< BranchDescription const >  bd)
private

Definition at line 277 of file Principal.cc.

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

Referenced by Principal().

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

Definition at line 283 of file Principal.cc.

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

Referenced by Principal().

283  {
284  auto phb = std::make_unique<PuttableProductResolver>(std::move(bd));
286  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:464
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::addUnscheduledProduct ( 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<UnscheduledProductResolver>(std::move(bd)));
296  }
void addProductOrThrow(std::unique_ptr< ProductResolverBase > phb)
Definition: Principal.cc:464
def move(src, dest)
Definition: eostools.py:510
void edm::Principal::adjustIndexesAfterProductRegistryAddition ( )

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

864  {
865  if(preg_->getNextIndexValue(branchType_) != productResolvers_.size()) {
866  productResolvers_.resize(preg_->getNextIndexValue(branchType_));
867  for(auto const& prod : preg_->productList()) {
868  BranchDescription const& bd = prod.second;
869  if(bd.branchType() == branchType_) {
870  ProductResolverIndex index = preg_->indexFrom(bd.branchID());
871  assert(index != ProductResolverIndexInvalid);
872  if(!productResolvers_[index]) {
873  // no product holder. Must add one. The new entry must be an input product holder.
874  assert(!bd.produced());
875  auto cbd = std::make_shared<BranchDescription const>(bd);
876  addInputProduct(cbd);
877  }
878  }
879  }
880  }
881  assert(preg_->getNextIndexValue(branchType_) == productResolvers_.size());
882  }
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:289
std::shared_ptr< ProductRegistry const > preg_
Definition: Principal.h:276
bool edm::Principal::adjustToNewProductRegistry ( ProductRegistry const &  reg)

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

260  {
261  ProductRegistry::ProductList const& prodsList = reg.productList();
262  for(auto const& prod : prodsList) {
263  BranchDescription const& bd = prod.second;
264  if(!bd.produced() && (bd.branchType() == branchType_)) {
265  auto cbd = std::make_shared<BranchDescription const>(bd);
266  auto phb = getExistingProduct(cbd->branchID());
267  if(phb == nullptr || phb->branchDescription().branchName() != cbd->branchName()) {
268  return false;
269  }
270  phb->resetBranchDescription(cbd);
271  }
272  }
273  return true;
274  }
BranchType branchType_
Definition: Principal.h:286
std::map< BranchKey, BranchDescription > ProductList
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
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 313 of file Principal.cc.

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

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

313  {
314  processHistoryPtr_.reset();
316  reader_ = nullptr;
317  for(auto& prod : *this) {
318  prod->resetProductData();
319  }
320  }
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 328 of file Principal.cc.

References getExistingProduct().

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

328  {
329  auto phb = getExistingProduct(id);
330  assert(nullptr != phb);
331  phb->unsafe_deleteProduct();
332  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
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 344 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_, edm::ProcessConfiguration::processName(), productLookup_, productRegistry(), reader(), reader_, and edm::s_emptyProcessHistory.

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

346  {
347  //increment identifier here since clearPrincipal isn't called for Run/Lumi
349  atEndTransition_=false;
350  if(reader) {
351  reader_ = reader;
352  }
353 
354  if (historyAppender_ && productRegistry().anyProductProduced()) {
356  historyAppender_->appendToProcessHistory(hist,
357  processHistoryRegistry.getMapped(hist),
360  }
361  else {
362  std::shared_ptr<ProcessHistory const> inputProcessHistory;
363  if (hist.isValid()) {
364  //does not own the pointer
365  auto noDel =[](void const*){};
366  inputProcessHistory =
367  std::shared_ptr<ProcessHistory const>(processHistoryRegistry.getMapped(hist),noDel);
368  if (inputProcessHistory.get() == nullptr) {
370  << "Principal::fillPrincipal\n"
371  << "Input ProcessHistory not found in registry\n"
372  << "Contact a Framework developer\n";
373  }
374  } else {
375  //Since this is static we don't want it deleted
376  inputProcessHistory = std::shared_ptr<ProcessHistory const>(&s_emptyProcessHistory,[](void const*){});
377  }
379  processHistoryPtr_ = inputProcessHistory;
380  }
381 
383  std::vector<std::string> const& lookupProcessNames = productLookup_->lookupProcessNames();
384  lookupProcessOrder_.assign(lookupProcessNames.size(), 0);
385  unsigned int k = 0;
386 
387  // We loop over processes in reverse order of the ProcessHistory.
388  // If any entries in the product lookup tables are associated with
389  // the process we add it to the vector of processes in the order
390  // the lookup should be performed. There is one exception though,
391  // We start with the current process even if it is not in the ProcessHistory.
392  // The current process might be needed but not be in the process
393  // history if all the products produced in the current process are
394  // transient.
395  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), processConfiguration_->processName());
396  if (nameIter != lookupProcessNames.end()) {
397  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
398  ++k;
399  }
400 
401  // We just looked for the current process so skip it if
402  // it is in the ProcessHistory.
403  auto iter = processHistoryPtr_->rbegin();
404  if (iter->processName() == processConfiguration_->processName()) {
405  ++iter;
406  }
407 
408  for (auto iEnd = processHistoryPtr_->rend(); iter != iEnd; ++iter) {
409  auto nameIter = std::find(lookupProcessNames.begin(), lookupProcessNames.end(), iter->processName());
410  if (nameIter == lookupProcessNames.end()) {
411  continue;
412  }
413  lookupProcessOrder_.at(k) = nameIter - lookupProcessNames.begin();
414  ++k;
415  }
417  }
418  }
static ProcessHistory const s_emptyProcessHistory
Definition: Principal.cc:33
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: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:291
std::string const & processName() const
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 668 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().

673  {
674 
675  bool skipCurrentProcess = inputTag.willSkipCurrentProcess();
676 
678 
679  if (index == ProductResolverIndexInvalid) {
680 
681  char const* processName = inputTag.process().c_str();
682  if (skipCurrentProcess) {
683  processName = "\0";
684  } else if (inputTag.process() == InputTag::kCurrentProcess) {
685  processName = processConfiguration_->processName().c_str();
686  }
687 
688  index = productLookup().index(kindOfType,
689  typeID,
690  inputTag.label().c_str(),
691  inputTag.instance().c_str(),
692  processName);
693 
694  if(index == ProductResolverIndexAmbiguous) {
695  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(),
697  } else if (index == ProductResolverIndexInvalid) {
698  return 0;
699  }
700  inputTag.tryToCacheIndex(index, typeID, branchType(), &productRegistry());
701  }
702  if(unlikely( consumer and (not consumer->registeredToConsume(index, skipCurrentProcess, branchType())))) {
703  failedToRegisterConsumes(kindOfType,typeID,inputTag.label(),inputTag.instance(),
705  }
706 
707 
708  auto const& productResolver = productResolvers_[index];
709 
710  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
711  if(resolution.isAmbiguous()) {
712  throwAmbiguousException("findProductByLabel", typeID, inputTag.label(), inputTag.instance(),
714  }
715  return resolution.data();
716  }
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: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
ProductResolverIndex index(KindOfType kindOfType, TypeID const &typeID, char const *moduleLabel, char const *instance, char const *process=0) const
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const &currentProcess)
Definition: Principal.cc:36
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:269
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 719 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.

726  {
727 
729  typeID,
730  label.c_str(),
731  instance.c_str(),
732  process.c_str());
733 
734  if(index == ProductResolverIndexAmbiguous) {
735  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
736  } else if (index == ProductResolverIndexInvalid) {
737  return 0;
738  }
739 
740  if(unlikely( consumer and (not consumer->registeredToConsume(index, false, branchType())))) {
741  failedToRegisterConsumes(kindOfType,typeID,label,instance,process);
742  }
743 
744  auto const& productResolver = productResolvers_[index];
745 
746  auto resolution = productResolver->resolveProduct(*this, false, sra, mcc);
747  if(resolution.isAmbiguous()) {
748  throwAmbiguousException("findProductByLabel", typeID, label, instance, process);
749  }
750  return resolution.data();
751  }
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: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=0) const
ProductData const * edm::Principal::findProductByTag ( TypeID const &  typeID,
InputTag const &  tag,
ModuleCallingContext const *  mcc 
) const

Definition at line 754 of file Principal.cc.

References findProductByLabel(), and edm::PRODUCT_TYPE.

Referenced by edm::getProductByTag().

754  {
755  ProductData const* productData =
757  typeID,
758  tag,
759  nullptr,
760  nullptr,
761  mcc);
762  return productData;
763  }
ProductData const * findProductByLabel(KindOfType kindOfType, TypeID const &typeID, InputTag const &inputTag, EDConsumerBase const *consumer, SharedResourcesAcquirer *sra, ModuleCallingContext const *mcc) const
Definition: Principal.cc:668
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 638 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().

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

Definition at line 785 of file Principal.cc.

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

785  {
786  provenances.clear();
787  for(auto const& productResolver : *this) {
788  if(productResolver->singleProduct() && productResolver->provenanceAvailable() && !productResolver->branchDescription().isAlias()) {
789  // We do not attempt to get the event/lumi/run status from the provenance,
790  // because the per event provenance may have been dropped.
791  if(productResolver->provenance()->branchDescription().present()) {
792  provenances.push_back(productResolver->provenance());
793  }
794  }
795  }
796  }
void edm::Principal::getAllStableProvenance ( std::vector< StableProvenance const * > &  provenances) const

Definition at line 802 of file Principal.cc.

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

802  {
803  provenances.clear();
804  for(auto const& productResolver : *this) {
805  if(productResolver->singleProduct() && !productResolver->branchDescription().isAlias()) {
806  if(productResolver->stableProvenance()->branchDescription().present()) {
807  provenances.push_back(productResolver->stableProvenance());
808  }
809  }
810  }
811  }
BasicHandle edm::Principal::getByLabel ( KindOfType  kindOfType,
TypeID const &  typeID,
InputTag const &  inputTag,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

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

502  {
503 
504  ProductData const* result = findProductByLabel(kindOfType, typeID, inputTag, consumer, sra, mcc);
505  if(result == 0) {
506  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
507  return makeNotFoundException("getByLabel", kindOfType, typeID, inputTag.label(), inputTag.instance(),
509  }));
510  }
511  return BasicHandle(result->wrapper(), &(result->provenance()));
512  }
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:668
static std::string appendCurrentProcessIfAlias(std::string const &processFromInputTag, std::string const &currentProcess)
Definition: Principal.cc:36
ProcessConfiguration const * processConfiguration_
Definition: Principal.h:269
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 515 of file Principal.cc.

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

522  {
523 
524  ProductData const* result = findProductByLabel(kindOfType, typeID, label, instance, process,consumer, sra, mcc);
525  if(result == 0) {
526  return BasicHandle(makeHandleExceptionFactory([=]()->std::shared_ptr<cms::Exception> {
527  return makeNotFoundException("getByLabel", kindOfType, typeID, label, instance, process);
528  }));
529  }
530  return BasicHandle(result->wrapper(), &(result->provenance()));
531  }
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:668
BasicHandle edm::Principal::getByToken ( KindOfType  kindOfType,
TypeID const &  typeID,
ProductResolverIndex  index,
bool  skipCurrentProcess,
bool &  ambiguous,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

Definition at line 534 of file Principal.cc.

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

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

540  {
542  auto& productResolver = productResolvers_[index];
543  assert(0!=productResolver.get());
544  auto resolution = productResolver->resolveProduct(*this, skipCurrentProcess, sra, mcc);
545  if(resolution.isAmbiguous()) {
546  ambiguous = true;
547  return BasicHandle();
548  }
549  auto productData = resolution.data();
550  if(productData == nullptr) {
551  return BasicHandle();
552  }
553  return BasicHandle(productData->wrapper(), &(productData->provenance()));
554  }
ProductResolverCollection productResolvers_
Definition: Principal.h:272
ProductResolverBase * edm::Principal::getExistingProduct ( BranchID const &  branchID)
protected

Definition at line 421 of file Principal.cc.

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

421  {
422  return const_cast<ProductResolverBase*>( const_cast<const Principal*>(this)->getExistingProduct(branchID));
423  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
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 426 of file Principal.cc.

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

426  {
427  ProductResolverIndex index = preg_->indexFrom(branchID);
428  assert(index != ProductResolverIndexInvalid);
429  return productResolvers_.at(index).get();
430  }
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 433 of file Principal.cc.

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

433  {
434  auto phb = getExistingProduct(productResolver.branchDescription().branchID());
435  if(nullptr != phb && BranchKey(productResolver.branchDescription()) != BranchKey(phb->branchDescription())) {
436  BranchDescription const& newProduct = phb->branchDescription();
437  BranchDescription const& existing = productResolver.branchDescription();
438  if(newProduct.branchName() != existing.branchName() && newProduct.branchID() == existing.branchID()) {
439  throw cms::Exception("HashCollision") << "Principal::getExistingProduct\n" <<
440  " Branch " << newProduct.branchName() << " has same branch ID as branch " << existing.branchName() << "\n" <<
441  "Workaround: change process name or product instance name of " << newProduct.branchName() << "\n";
442  } else {
443  assert(nullptr == phb || BranchKey(productResolver.branchDescription()) == BranchKey(phb->branchDescription()));
444  }
445  }
446  return phb;
447  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
BranchDescription const & branchDescription() const
WrapperBase const * edm::Principal::getIt ( ProductID const &  ) const
overrideprivatevirtual

Implements edm::EDProductGetter.

Reimplemented in edm::EventPrincipal.

Definition at line 826 of file Principal.cc.

826  {
827  assert(false);
828  return nullptr;
829  }
void edm::Principal::getManyByType ( TypeID const &  typeID,
BasicHandleVec results,
EDConsumerBase const *  consumes,
SharedResourcesAcquirer sra,
ModuleCallingContext const *  mcc 
) const

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

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

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

481  {
482  ProductResolverIndex index = preg_->indexFrom(bid);
483  if(index == ProductResolverIndexInvalid){
484  return ConstProductResolverPtr();
485  }
486  return getProductResolverByIndex(index);
487  }
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:490
Principal::ConstProductResolverPtr edm::Principal::getProductResolverByIndex ( ProductResolverIndex const &  oid) const
Provenance edm::Principal::getProvenance ( BranchID const &  bid,
ModuleCallingContext const *  mcc 
) const

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

767  {
769  if(phb == nullptr) {
771  }
772 
773  if(phb->unscheduledWasNotRun()) {
774  if(not phb->resolveProduct(*this,false, nullptr, mcc).data() ) {
775  throwProductNotFoundException("getProvenance(onDemand)", errors::ProductNotFound, bid);
776  }
777  }
778  return *phb->provenance();
779  }
ProductResolverBase const * ConstProductResolverPtr
Definition: Principal.h:63
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:481
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.

Reimplemented in edm::EventPrincipal.

Definition at line 832 of file Principal.cc.

832  {
833  assert(false);
834  return nullptr;
835  }
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 838 of file Principal.cc.

840  {
841  assert(false);
842  }
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 557 of file Principal.cc.

References productResolvers_.

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

560  {
561  auto const& productResolver = productResolvers_.at(index);
562  assert(0!=productResolver.get());
563  productResolver->prefetchAsync(task,*this, skipCurrentProcess,nullptr,mcc);
564  }
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 850 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().

850  {
851  if(edp.get() == nullptr) {
852  throw edm::Exception(edm::errors::InsertFailure,"Null Pointer")
853  << "put: Cannot put because unique_ptr to product is null."
854  << "\n";
855  }
856  auto phb = getExistingProduct(bd.branchID());
857  assert(phb);
858  // ProductResolver assumes ownership
859  putOrMerge(std::move(edp), phb);
860  }
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:421
void putOrMerge(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp) const
Definition: Principal.cc:850
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 845 of file Principal.cc.

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

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

Definition at line 885 of file Principal.cc.

References parseEventContent::prod, and reader().

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

885  {
886  if(not reader()) {return;}
887 
888  for(auto & prod : *this) {
889  prod->retrieveAndMerge(*this);
890  }
891  }
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 814 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_().

814  {
815  for(auto& prod : bids) {
816  ProductResolverIndex index= preg_->indexFrom(prod);
817  assert(index!=ProductResolverIndexInvalid);
818  ProductResolverIndex indexO = other.preg_->indexFrom(prod);
819  assert(indexO!=ProductResolverIndexInvalid);
820  get_underlying_safe(productResolvers_[index]).swap(get_underlying_safe(other.productResolvers_[indexO]));
821  }
822  reader_->mergeReaders(other.reader());
823  }
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 894 of file Principal.cc.

References parseEventContent::prod.

894  {
895  for( auto & prod : *this) {
896  prod->resetFailedFromThisProcess();
897  }
898  }
void edm::Principal::setAtEndTransition ( bool  iAtEnd)
void edm::Principal::setupUnscheduled ( UnscheduledConfigurator const &  iConfigure)

Definition at line 335 of file Principal.cc.

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

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

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

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

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

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(), findProductByLabel(), and getByLabel().

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().