CMS 3D CMS Logo

EventPrincipal.cc
Go to the documentation of this file.
2 
23 
24 #include <algorithm>
25 #include <cassert>
26 #include <limits>
27 #include <memory>
28 
29 namespace edm {
31  std::shared_ptr<ProductRegistry const> reg,
32  std::shared_ptr<BranchIDListHelper const> branchIDListHelper,
33  std::shared_ptr<ThinnedAssociationsHelper const> thinnedAssociationsHelper,
34  ProcessConfiguration const& pc,
35  HistoryAppender* historyAppender,
36  unsigned int streamIndex,
37  bool isForPrimaryProcess) :
38  Base(reg, reg->productLookup(InEvent), pc, InEvent, historyAppender,isForPrimaryProcess),
39  aux_(),
40  luminosityBlockPrincipal_(),
41  provRetrieverPtr_(new ProductProvenanceRetriever(streamIndex)),
42  eventSelectionIDs_(),
43  branchIDListHelper_(branchIDListHelper),
44  thinnedAssociationsHelper_(thinnedAssociationsHelper),
45  branchListIndexes_(),
46  branchListIndexToProcessIndex_(),
47  streamID_(streamIndex) {
49  }
50 
51  void
54  aux_ = EventAuxiliary();
55  luminosityBlockPrincipal_ = nullptr; // propagate_const<T> has no reset() function
56  provRetrieverPtr_->reset();
58  }
59 
60  void
62  ProcessHistoryRegistry const& processHistoryRegistry,
65  ProductProvenanceRetriever const& provRetriever,
67  bool deepCopyRetriever) {
69  if (deepCopyRetriever) {
70  provRetrieverPtr_->deepCopy(provRetriever);
71  } else {
72  provRetrieverPtr_->mergeParentProcessRetriever(provRetriever);
73  }
75  if(branchIDListHelper_->hasProducedProducts()) {
76  // Add index into BranchIDListRegistry for products produced this process
77  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
78  }
79  fillEventPrincipal(aux,processHistoryRegistry,reader);
80  }
81 
82  void
84  ProcessHistoryRegistry const& processHistoryRegistry,
89  if(branchIDListHelper_->hasProducedProducts()) {
90  // Add index into BranchIDListRegistry for products produced this process
91  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
92  }
93  fillEventPrincipal(aux,processHistoryRegistry,nullptr);
94  }
95 
96  void
98  ProcessHistoryRegistry const& processHistoryRegistry,
100  if(aux.event() == invalidEventNumber) {
102  << "EventPrincipal::fillEventPrincipal, Invalid event number provided in EventAuxiliary, It is illegal for the event number to be 0\n";
103  }
104 
105  fillPrincipal(aux.processHistoryID(), processHistoryRegistry, reader);
106  aux_ = aux;
108 
109  if(branchListIndexes_.empty() and branchIDListHelper_->hasProducedProducts()) {
110  // Add index into BranchIDListRegistry for products produced this process
111  // if it hasn't already been filled in by the other fillEventPrincipal or by an earlier call to this function
112  branchListIndexes_.push_back(branchIDListHelper_->producedBranchListIndex());
113  }
114 
115  // Fill in helper map for Branch to ProductID mapping
116  ProcessIndex pix = 0;
117  for(auto const& blindex : branchListIndexes_) {
118  branchListIndexToProcessIndex_.insert(std::make_pair(blindex, pix));
119  ++pix;
120  }
121 
122  // Fill in the product ID's in the product holders.
123  for(auto& prod : *this) {
124  if (prod->singleProduct()) {
125  // If an alias is in the same process as the original then isAlias will be true.
126  // Under that condition, we want the ProductID to be the same as the original.
127  // If not, then we've internally changed the original BranchID to the alias BranchID
128  // in the ProductID lookup so we need the alias BranchID.
129  auto const & bd =prod->branchDescription();
130  prod->setProvenance(productProvenanceRetrieverPtr(),
131  processHistory(),
132  branchIDToProductID(bd.isAlias()?bd.originalBranchID(): bd.branchID()));
133  }
134  }
135  }
136 
137  void
138  EventPrincipal::setLuminosityBlockPrincipal(std::shared_ptr<LuminosityBlockPrincipal> const& lbp) {
140  }
141 
142  void
144  assert(run == luminosityBlockPrincipal_->run());
145  assert(lumi == luminosityBlockPrincipal_->luminosityBlock());
146  EventNumber_t event = aux_.id().event();
147  aux_.id() = EventID(run, lumi, event);
148  }
149 
150  RunPrincipal const&
153  }
154 
155  void
157  BranchDescription const& bd,
158  std::unique_ptr<WrapperBase> edp,
159  ProductProvenance const& productProvenance) const {
160 
161  // assert commented out for DaqSource. When DaqSource no longer uses put(), the assert can be restored.
162  //assert(produced());
163  if(edp.get() == nullptr) {
164  throw Exception(errors::InsertFailure, "Null Pointer")
165  << "put: Cannot put because ptr to product is null."
166  << "\n";
167  }
168  productProvenanceRetrieverPtr()->insertIntoSet(productProvenance);
169  auto phb = getExistingProduct(bd.branchID());
170  assert(phb);
171  // ProductResolver assumes ownership
172  phb->putProduct(std::move(edp));
173  }
174 
175  void
177  BranchDescription const& bd,
178  std::unique_ptr<WrapperBase> edp,
179  ProductProvenance const* productProvenance) const {
180 
181  assert(!bd.produced());
182  if (productProvenance) {
183  productProvenanceRetrieverPtr()->insertIntoSet(*productProvenance);
184  }
185  auto phb = getExistingProduct(bd.branchID());
186  assert(phb);
187  // ProductResolver assumes ownership
188  phb->putProduct(std::move(edp));
189  }
190 
191  BranchID
193  if(!pid.isValid()) {
194  throw Exception(errors::ProductNotFound, "InvalidID")
195  << "get by product ID: invalid ProductID supplied\n";
196  }
197  return productIDToBranchID(pid, branchIDListHelper_->branchIDLists(), branchListIndexes_);
198  }
199 
200  ProductID
202  if(!bid.isValid()) {
203  throw Exception(errors::NotFound, "InvalidID")
204  << "branchIDToProductID: invalid BranchID supplied\n";
205  }
206  typedef BranchIDListHelper::BranchIDToIndexMap BIDToIndexMap;
207  typedef BIDToIndexMap::const_iterator Iter;
208  typedef std::pair<Iter, Iter> IndexRange;
209 
210  IndexRange range = branchIDListHelper_->branchIDToIndexMap().equal_range(bid);
211  for(Iter it = range.first; it != range.second; ++it) {
212  BranchListIndex blix = it->second.first;
213  std::map<BranchListIndex, ProcessIndex>::const_iterator i = branchListIndexToProcessIndex_.find(blix);
214  if(i != branchListIndexToProcessIndex_.end()) {
215  ProductIndex productIndex = it->second.second;
216  ProcessIndex processIndex = i->second;
217  return ProductID(processIndex+1, productIndex+1);
218  }
219  }
220  // cannot throw, because some products may legitimately not have product ID's (e.g. pile-up).
221  return ProductID();
222  }
223 
224  unsigned int
226  return streamID_.value();
227  }
228 
231  exception<<"get by product ID: The product with given id: "<<pid
232  <<"\ntype: "<<phb->productType()
233  <<"\nproduct instance name: "<<phb->productInstanceName()
234  <<"\nprocess name: "<<phb->processName()
235  <<"\nwas already deleted. This is a configuration error. Please change the configuration of the module which caused this exception to state it reads this data.";
236  throw exception;
237  }
238 
241  BranchID bid = pidToBid(pid);
243  if(phb == nullptr) {
244  return BasicHandle(makeHandleExceptionFactory([pid]()->std::shared_ptr<cms::Exception> {
245  std::shared_ptr<cms::Exception> whyFailed(std::make_shared<Exception>(errors::ProductNotFound, "InvalidID"));
246  *whyFailed
247  << "get by product ID: no product with given id: " << pid << "\n";
248  return whyFailed;
249  }));
250  }
251 
252  // Was this already deleted?
253  if(phb->productWasDeleted()) {
255  }
256  // Check for case where we tried on demand production and
257  // it failed to produce the object
258  if(phb->unscheduledWasNotRun()) {
259  return BasicHandle(makeHandleExceptionFactory([pid]()->std::shared_ptr<cms::Exception> {
260  std::shared_ptr<cms::Exception> whyFailed(std::make_shared<Exception>(errors::ProductNotFound, "InvalidID"));
261  *whyFailed
262  << "get by ProductID: could not get product with id: " << pid << "\n"
263  << "Unscheduled execution not allowed to get via ProductID.\n";
264  return whyFailed;
265  }));
266  }
267  auto resolution = phb->resolveProduct(*this,false,nullptr,nullptr);
268 
269  auto data = resolution.data();
270  if(data) {
271  return BasicHandle(data->wrapper(), &(data->provenance()));
272  }
273  return BasicHandle(nullptr,nullptr);
274  }
275 
276  WrapperBase const*
278  return getByProductID(pid).wrapper();
279  }
280 
281  WrapperBase const*
282  EventPrincipal::getThinnedProduct(ProductID const& pid, unsigned int& key) const {
283 
284  BranchID parent = pidToBid(pid);
285 
286  // Loop over thinned containers which were made by selecting elements from the parent container
287  for(auto associatedBranches = thinnedAssociationsHelper_->parentBegin(parent),
288  iEnd = thinnedAssociationsHelper_->parentEnd(parent);
289  associatedBranches != iEnd; ++associatedBranches) {
290 
291  ThinnedAssociation const* thinnedAssociation =
292  getThinnedAssociation(associatedBranches->association());
293  if(thinnedAssociation == nullptr) continue;
294 
295  if(associatedBranches->parent() != pidToBid(thinnedAssociation->parentCollectionID())) {
296  continue;
297  }
298 
299  unsigned int thinnedIndex = 0;
300  // Does this thinned container have the element referenced by key?
301  // If yes, thinnedIndex is set to point to it in the thinned container
302  if(!thinnedAssociation->hasParentIndex(key, thinnedIndex)) {
303  continue;
304  }
305  // Get the thinned container and return a pointer if we can find it
306  ProductID const& thinnedCollectionPID = thinnedAssociation->thinnedCollectionID();
307  BasicHandle bhThinned = getByProductID(thinnedCollectionPID);
308  if(!bhThinned.isValid()) {
309  // Thinned container is not found, try looking recursively in thinned containers
310  // which were made by selecting elements from this thinned container.
311  WrapperBase const* wrapperBase = getThinnedProduct(thinnedCollectionPID, thinnedIndex);
312  if(wrapperBase != nullptr) {
313  key = thinnedIndex;
314  return wrapperBase;
315  } else {
316  continue;
317  }
318  }
319  key = thinnedIndex;
320  return bhThinned.wrapper();
321  }
322  return nullptr;
323  }
324 
325  void
327  std::vector<WrapperBase const*>& foundContainers,
328  std::vector<unsigned int>& keys) const {
329 
330  BranchID parent = pidToBid(pid);
331 
332  // Loop over thinned containers which were made by selecting elements from the parent container
333  for(auto associatedBranches = thinnedAssociationsHelper_->parentBegin(parent),
334  iEnd = thinnedAssociationsHelper_->parentEnd(parent);
335  associatedBranches != iEnd; ++associatedBranches) {
336 
337  ThinnedAssociation const* thinnedAssociation =
338  getThinnedAssociation(associatedBranches->association());
339  if(thinnedAssociation == nullptr) continue;
340 
341  if(associatedBranches->parent() != pidToBid(thinnedAssociation->parentCollectionID())) {
342  continue;
343  }
344 
345  unsigned nKeys = keys.size();
346  unsigned int doNotLookForThisIndex = std::numeric_limits<unsigned int>::max();
347  std::vector<unsigned int> thinnedIndexes(nKeys, doNotLookForThisIndex);
348  bool hasAny = false;
349  for(unsigned k = 0; k < nKeys; ++k) {
350  // Already found this one
351  if(foundContainers[k] != nullptr) continue;
352  // Already know this one is not in this thinned container
353  if(keys[k] == doNotLookForThisIndex) continue;
354  // Does the thinned container hold the entry of interest?
355  // Modifies thinnedIndexes[k] only if it returns true and
356  // sets it to the index in the thinned collection.
357  if(thinnedAssociation->hasParentIndex(keys[k], thinnedIndexes[k])) {
358  hasAny = true;
359  }
360  }
361  if(!hasAny) {
362  continue;
363  }
364  // Get the thinned container and set the pointers and indexes into
365  // it (if we can find it)
366  ProductID thinnedCollectionPID = thinnedAssociation->thinnedCollectionID();
367  BasicHandle bhThinned = getByProductID(thinnedCollectionPID);
368  if(!bhThinned.isValid()) {
369  // Thinned container is not found, try looking recursively in thinned containers
370  // which were made by selecting elements from this thinned container.
371  getThinnedProducts(thinnedCollectionPID, foundContainers, thinnedIndexes);
372  for(unsigned k = 0; k < nKeys; ++k) {
373  if(foundContainers[k] == nullptr) continue;
374  if(thinnedIndexes[k] == doNotLookForThisIndex) continue;
375  keys[k] = thinnedIndexes[k];
376  }
377  } else {
378  for(unsigned k = 0; k < nKeys; ++k) {
379  if(thinnedIndexes[k] == doNotLookForThisIndex) continue;
380  keys[k] = thinnedIndexes[k];
381  foundContainers[k] = bhThinned.wrapper();
382  }
383  }
384  }
385  }
386 
387  Provenance
389  BranchID bid = pidToBid(pid);
390  return getProvenance(bid, mcc);
391  }
392 
395  return eventSelectionIDs_;
396  }
397 
398  BranchListIndexes const&
400  return branchListIndexes_;
401  }
402 
405 
406  ConstProductResolverPtr const phb = getProductResolver(branchID);
407 
408  if(phb == nullptr) {
410  << "EventPrincipal::getThinnedAssociation, ThinnedAssociation ProductResolver cannot be found\n"
411  << "This should never happen. Contact a Framework developer";
412  }
413  ProductData const* productData = (phb->resolveProduct(*this,false,nullptr,nullptr)).data();
414  if (productData == nullptr) {
415  return nullptr;
416  }
417  WrapperBase const* product = productData->wrapper();
418  if(!(typeid(edm::ThinnedAssociation) == product->dynamicTypeInfo())) {
420  << "EventPrincipal::getThinnedProduct, product has wrong type, not a ThinnedAssociation.\n";
421  }
422  Wrapper<ThinnedAssociation> const* wrapper = static_cast<Wrapper<ThinnedAssociation> const*>(product);
423  return wrapper->product();
424  }
425 
426 }
RunPrincipal const & runPrincipal() const
std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper_
EventNumber_t event() const
Definition: EventID.h:41
void clearPrincipal()
Definition: Principal.cc:312
unsigned short BranchListIndex
void setLuminosityBlockPrincipal(std::shared_ptr< LuminosityBlockPrincipal > const &lbp)
EventSelectionIDVector const & eventSelectionIDs() const
virtual WrapperBase const * getThinnedProduct(ProductID const &pid, unsigned int &key) const override
std::type_info const & dynamicTypeInfo() const
Definition: WrapperBase.h:38
RunNumber_t run() const
BasicHandle getByProductID(ProductID const &oid) const
EventSelectionIDVector eventSelectionIDs_
BranchID pidToBid(ProductID const &pid) const
BranchListIndexes branchListIndexes_
edm::ThinnedAssociation const * getThinnedAssociation(edm::BranchID const &branchID) const
ProductResolverBase * getExistingProduct(BranchID const &branchID)
Definition: Principal.cc:400
EventPrincipal(std::shared_ptr< ProductRegistry const > reg, std::shared_ptr< BranchIDListHelper const > branchIDListHelper, std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper, ProcessConfiguration const &pc, HistoryAppender *historyAppender, unsigned int streamIndex=0, bool isForPrimaryProcess=true)
Provenance getProvenance(ProductID const &pid, ModuleCallingContext const *mcc) const
std::map< BranchListIndex, ProcessIndex > branchListIndexToProcessIndex_
unsigned long long EventNumber_t
WrapperBase const * wrapper() const
Definition: ProductData.h:32
std::shared_ptr< BranchIDListHelper const > branchIDListHelper_
EventAuxiliary aux_
bool isValid() const
Definition: BranchID.h:24
edm::propagate_const< std::shared_ptr< ProductProvenanceRetriever > > provRetrieverPtr_
BranchListIndexes const & branchListIndexes() const
unsigned int LuminosityBlockNumber_t
ProcessHistory const & processHistory() const
Definition: Principal.h:141
ProductID branchIDToProductID(BranchID const &bid) const
RunPrincipal const & runPrincipal() const
std::vector< EventSelectionID > EventSelectionIDVector
virtual void getThinnedProducts(ProductID const &pid, std::vector< WrapperBase const * > &foundContainers, std::vector< unsigned int > &keys) const override
static void throwProductDeletedException(ProductID const &pid, edm::EventPrincipal::ConstProductResolverPtr const phb)
EventNumber_t const invalidEventNumber
std::vector< BranchListIndex > BranchListIndexes
BranchID productIDToBranchID(ProductID const &pid, BranchIDLists const &lists, BranchListIndexes const &indexes)
ProcessHistoryID const & processHistoryID() const
Definition: Principal.h:145
LuminosityBlockPrincipal const & luminosityBlockPrincipal() const
std::shared_ptr< HandleExceptionFactory > makeHandleExceptionFactory(T &&iFunctor)
Base::ConstProductResolverPtr ConstProductResolverPtr
WrapperBase const * wrapper() const
Definition: BasicHandle.h:90
BranchID const & branchID() const
void put(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp, ProductProvenance const &productProvenance) const
ProductID const & thinnedCollectionID() const
std::multimap< BranchID, IndexPair > BranchIDToIndexMap
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
int k[5][pyjets_maxn]
unsigned short ProcessIndex
Definition: ProductID.h:25
DelayedReader * reader() const
Definition: Principal.h:184
unsigned int value() const
Definition: StreamID.h:46
T const * product() const
Definition: Wrapper.h:32
void putOnRead(BranchDescription const &bd, std::unique_ptr< WrapperBase > edp, ProductProvenance const *productProvenance) const
edm::propagate_const< std::shared_ptr< LuminosityBlockPrincipal > > luminosityBlockPrincipal_
void setProcessHistoryID(ProcessHistoryID const &phid)
bool isValid() const
Definition: BasicHandle.h:82
ProcessHistoryID const & processHistoryID() const
EventID const & id() const
void fillEventPrincipal(EventAuxiliary const &aux, ProcessHistoryRegistry const &processHistoryRegistry, DelayedReader *reader=0)
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:460
virtual unsigned int transitionIndex_() const override
unsigned short ProductIndex
Definition: ProductID.h:26
unsigned int RunNumber_t
ProductID const & parentCollectionID() const
bool isValid() const
Definition: ProductID.h:35
bool hasParentIndex(unsigned int parentIndex, unsigned int &thinnedIndex) const
void setRunAndLumiNumber(RunNumber_t run, LuminosityBlockNumber_t lumi)
void fillPrincipal(ProcessHistoryID const &hist, ProcessHistoryRegistry const &phr, DelayedReader *reader)
Definition: Principal.cc:343
EventAuxiliary const & aux() const
EventNumber_t event() const
def move(src, dest)
Definition: eostools.py:510
virtual WrapperBase const * getIt(ProductID const &pid) const override
Definition: event.py:1
static HepMC::HEPEVT_Wrapper wrapper
void insertIntoSet(ProductProvenance const &provenanceProduct) const