CMS 3D CMS Logo

SubProcess.cc
Go to the documentation of this file.
2 
44 
45 #include "boost/range/adaptor/reversed.hpp"
46 
47 #include <cassert>
48 #include <exception>
49 #include <string>
50 
51 namespace edm {
52 
54  ParameterSet const& topLevelParameterSet,
55  std::shared_ptr<ProductRegistry const> parentProductRegistry,
56  std::shared_ptr<BranchIDListHelper const> parentBranchIDListHelper,
57  ProcessBlockHelperBase const& parentProcessBlockHelper,
58  ThinnedAssociationsHelper const& parentThinnedAssociationsHelper,
59  SubProcessParentageHelper const& parentSubProcessParentageHelper,
61  ActivityRegistry& parentActReg,
62  ServiceToken const& token,
64  PreallocationConfiguration const& preallocConfig,
65  ProcessContext const* parentProcessContext,
66  ModuleTypeResolverMaker const* typeResolverMaker)
67  : EDConsumerBase(),
68  serviceToken_(),
69  parentPreg_(parentProductRegistry),
70  preg_(),
71  branchIDListHelper_(),
72  act_table_(),
73  processConfiguration_(),
74  historyLumiOffset_(preallocConfig.numberOfStreams()),
75  historyRunOffset_(historyLumiOffset_ + preallocConfig.numberOfLuminosityBlocks()),
76  processHistoryRegistries_(historyRunOffset_ + preallocConfig.numberOfRuns()),
77  historyAppenders_(historyRunOffset_ + preallocConfig.numberOfRuns()),
78  principalCache_(),
79  esp_(),
80  schedule_(),
81  subProcesses_(),
82  processParameterSet_(),
83  productSelectorRules_(parameterSet, "outputCommands", "OutputModule"),
84  productSelector_(),
85  wantAllEvents_(true) {
86  //Setup the event selection
88 
89  ParameterSet selectevents = parameterSet.getUntrackedParameterSet("SelectEvents", ParameterSet());
90 
91  selectevents.registerIt(); // Just in case this PSet is not registered
93  selectevents, tns->getProcessName(), getAllTriggerNames(), selectors_, consumesCollector());
94  std::map<std::string, std::vector<std::pair<std::string, int>>> outputModulePathPositions;
96  selectevents, "", outputModulePathPositions, parentProductRegistry->anyProductProduced());
97 
98  std::map<BranchID, bool> keepAssociation;
99  selectProducts(*parentProductRegistry, parentThinnedAssociationsHelper, keepAssociation);
100 
101  std::string const maxEvents("maxEvents");
102  std::string const maxLumis("maxLuminosityBlocks");
103 
104  // propagate_const<T> has no reset() function
106  std::unique_ptr<ParameterSet>(parameterSet.popParameterSet(std::string("process")).release());
107 
108  // if this process has a maxEvents or maxLuminosityBlocks parameter set, remove them.
109  if (processParameterSet_->exists(maxEvents)) {
110  processParameterSet_->popParameterSet(maxEvents);
111  }
112  if (processParameterSet_->exists(maxLumis)) {
113  processParameterSet_->popParameterSet(maxLumis);
114  }
115 
116  // if the top level process has a maxEvents or maxLuminosityBlocks parameter set, add them to this process.
117  if (topLevelParameterSet.exists(maxEvents)) {
118  processParameterSet_->addUntrackedParameter<ParameterSet>(
119  maxEvents, topLevelParameterSet.getUntrackedParameterSet(maxEvents));
120  }
121  if (topLevelParameterSet.exists(maxLumis)) {
122  processParameterSet_->addUntrackedParameter<ParameterSet>(
123  maxLumis, topLevelParameterSet.getUntrackedParameterSet(maxLumis));
124  }
125 
126  // If there are subprocesses, pop the subprocess parameter sets out of the process parameter set
127  auto subProcessVParameterSet = popSubProcessVParameterSet(*processParameterSet_);
128  bool hasSubProcesses = !subProcessVParameterSet.empty();
129 
130  // Validates the parameters in the 'options', 'maxEvents', and 'maxLuminosityBlocks'
131  // top level parameter sets. Default values are also set in here if the
132  // parameters were not explicitly set.
134 
135  processBlockHelper_ = std::make_shared<SubProcessBlockHelper>();
136 
137  ScheduleItems items(*parentProductRegistry, *this, *processBlockHelper_, parentProcessBlockHelper);
138  actReg_ = items.actReg_;
139 
140  //initialize the services
141  ServiceToken iToken;
142 
143  // get any configured services.
144  auto serviceSets = processParameterSet_->popVParameterSet(std::string("services"));
145 
146  ServiceToken newToken = items.initServices(serviceSets, *processParameterSet_, token, iLegacy, false);
147  parentActReg.connectToSubProcess(*items.actReg_);
148  serviceToken_ = items.addCPRandTNS(*processParameterSet_, newToken);
149 
150  //make the services available
152 
153  // intialize miscellaneous items
154  items.initMisc(*processParameterSet_);
155 
156  // intialize the event setup provider
157  esp_ = esController.makeProvider(*processParameterSet_, actReg_.get());
158 
159  branchIDListHelper_ = items.branchIDListHelper();
160  updateBranchIDListHelper(parentBranchIDListHelper->branchIDLists());
161 
162  thinnedAssociationsHelper_ = items.thinnedAssociationsHelper();
163  thinnedAssociationsHelper_->updateFromParentProcess(
164  parentThinnedAssociationsHelper, keepAssociation, droppedBranchIDToKeptBranchID_);
165 
166  // intialize the Schedule
167  schedule_ = items.initSchedule(*processParameterSet_,
168  hasSubProcesses,
169  preallocConfig,
171  typeResolverMaker,
173 
174  // set the items
175  act_table_ = std::move(items.act_table_);
176  preg_ = items.preg();
177 
178  subProcessParentageHelper_ = items.subProcessParentageHelper();
179  subProcessParentageHelper_->update(parentSubProcessParentageHelper, *parentProductRegistry);
180 
181  processConfiguration_ = items.processConfiguration();
183  processContext_.setParentProcessContext(parentProcessContext);
184 
186  for (unsigned int index = 0; index < preallocConfig.numberOfStreams(); ++index) {
187  auto ep = std::make_shared<EventPrincipal>(preg_,
192  index,
193  false /*not primary process*/,
196  }
197 
198  for (unsigned int index = 0; index < preallocConfig.numberOfRuns(); ++index) {
199  auto rpp = std::make_unique<RunPrincipal>(
202  }
203 
204  for (unsigned int index = 0; index < preallocConfig.numberOfLuminosityBlocks(); ++index) {
205  auto lbpp = std::make_unique<LuminosityBlockPrincipal>(
208  }
209 
210  {
211  auto pb = std::make_unique<ProcessBlockPrincipal>(preg_, *processConfiguration_, false);
213 
214  auto pbForInput = std::make_unique<ProcessBlockPrincipal>(preg_, *processConfiguration_, false);
216  }
217 
218  inUseRunPrincipals_.resize(preallocConfig.numberOfRuns());
219  inUseLumiPrincipals_.resize(preallocConfig.numberOfLuminosityBlocks());
220 
221  subProcesses_.reserve(subProcessVParameterSet.size());
222  for (auto& subProcessPSet : subProcessVParameterSet) {
223  subProcesses_.emplace_back(subProcessPSet,
224  topLevelParameterSet,
225  preg_,
230  esController,
231  *items.actReg_,
232  newToken,
233  iLegacy,
234  preallocConfig,
236  typeResolverMaker);
237  }
238  }
239 
241 
242  std::vector<ModuleProcessName> SubProcess::keepOnlyConsumedUnscheduledModules(bool deleteModules) {
243  schedule_->convertCurrentProcessAlias(processConfiguration_->processName());
245 
246  // Note: all these may throw
248 
249  // Consumes information from the child SubProcesses
250  std::vector<ModuleProcessName> consumedByChildren;
251  for_all(subProcesses_, [&consumedByChildren, deleteModules](auto& subProcess) {
252  auto c = subProcess.keepOnlyConsumedUnscheduledModules(deleteModules);
253  if (consumedByChildren.empty()) {
254  std::swap(consumedByChildren, c);
255  } else if (not c.empty()) {
256  std::vector<ModuleProcessName> tmp;
257  tmp.reserve(consumedByChildren.size() + c.size());
258  std::merge(consumedByChildren.begin(), consumedByChildren.end(), c.begin(), c.end(), std::back_inserter(tmp));
259  std::swap(consumedByChildren, tmp);
260  }
261  });
262 
263  // Non-consumed unscheduled modules in this SubProcess, take into account of the consumes from child SubProcesses
264  if (deleteModules) {
265  if (auto const unusedModules = nonConsumedUnscheduledModules(pathsAndConsumesOfModules_, consumedByChildren);
266  not unusedModules.empty()) {
268 
269  edm::LogInfo("DeleteModules").log([&unusedModules, this](auto& l) {
270  l << "Following modules are not in any Path or EndPath, nor is their output consumed by any other module, "
271  "and "
272  "therefore they are deleted from SubProcess "
273  << processConfiguration_->processName() << " before beginJob transition.";
274  for (auto const& description : unusedModules) {
275  l << "\n " << description->moduleLabel();
276  }
277  });
278  for (auto const& description : unusedModules) {
279  schedule_->deleteModule(description->moduleLabel(), actReg_.get());
280  }
281  }
282  }
283 
284  // Products possibly consumed from the parent (Sub)Process
285  for (auto const& description : pathsAndConsumesOfModules_.allModules()) {
286  for (auto const& dep :
288  auto it = std::lower_bound(consumedByChildren.begin(),
289  consumedByChildren.end(),
290  ModuleProcessName{dep.moduleLabel(), dep.processName()});
291  consumedByChildren.emplace(it, dep.moduleLabel(), dep.processName());
292  }
293  }
294  return consumedByChildren;
295  }
296 
298 
299  void SubProcess::doEndJob(ExceptionCollector& collector) { endJob(collector); }
300 
302  // If event selection is being used, the SubProcess class reads TriggerResults
303  // object(s) in the parent process from the event. This next call is needed for
304  // getByToken to work properly. Normally, this is done by the worker, but since
305  // a SubProcess is not a module, it has no worker.
306  updateLookup(InEvent, *parentPreg_->productLookup(InEvent), false);
307 
308  if (!droppedBranchIDToKeptBranchID().empty()) {
310  }
312 
313  std::exception_ptr firstException;
314  CMS_SA_ALLOW try {
315  schedule_->beginJob(
316  *preg_, esp_->recordsToResolverIndices(), *processBlockHelper_, pathsAndConsumesOfModules_, processContext_);
317  } catch (...) {
318  firstException = std::current_exception();
319  }
320  for (auto& subProcess : subProcesses_) {
321  CMS_SA_ALLOW try { subProcess.doBeginJob(); } catch (...) {
322  if (!firstException) {
323  firstException = std::current_exception();
324  }
325  }
326  }
327  if (firstException) {
328  std::rethrow_exception(firstException);
329  }
330  }
331 
334  try {
335  convertException::wrap([this, &collector]() { schedule_->endJob(collector); });
336  } catch (cms::Exception const& ex) {
337  collector.addException(ex);
338  }
339  for (auto& subProcess : subProcesses_) {
340  subProcess.doEndJob(collector);
341  }
342  }
343 
345  ThinnedAssociationsHelper const& parentThinnedAssociationsHelper,
346  std::map<BranchID, bool>& keepAssociation) {
348  return;
350 
351  // TODO: See if we can collapse keptProducts_ and productSelector_ into a
352  // single object. See the notes in the header for ProductSelector
353  // for more information.
354 
355  std::map<BranchID, BranchDescription const*> trueBranchIDToKeptBranchDesc;
356  std::vector<BranchDescription const*> associationDescriptions;
357  std::set<BranchID> keptProductsInEvent;
358 
359  for (auto const& it : preg.productList()) {
360  BranchDescription const& desc = it.second;
361  if (desc.transient()) {
362  // if the class of the branch is marked transient, output nothing
363  } else if (!desc.present() && !desc.produced()) {
364  // else if the branch containing the product has been previously dropped,
365  // output nothing
366  } else if (desc.unwrappedType() == typeid(ThinnedAssociation)) {
367  associationDescriptions.push_back(&desc);
368  } else if (productSelector_.selected(desc)) {
369  keepThisBranch(desc, trueBranchIDToKeptBranchDesc, keptProductsInEvent);
370  }
371  }
372 
373  parentThinnedAssociationsHelper.selectAssociationProducts(
374  associationDescriptions, keptProductsInEvent, keepAssociation);
375 
376  for (auto association : associationDescriptions) {
377  if (keepAssociation[association->branchID()]) {
378  keepThisBranch(*association, trueBranchIDToKeptBranchDesc, keptProductsInEvent);
379  }
380  }
381 
382  // Now fill in a mapping needed in the case that a branch was dropped while its EDAlias was kept.
383  ProductSelector::fillDroppedToKept(preg, trueBranchIDToKeptBranchDesc, droppedBranchIDToKeptBranchID_);
384  }
385 
387  std::map<BranchID, BranchDescription const*>& trueBranchIDToKeptBranchDesc,
388  std::set<BranchID>& keptProductsInEvent) {
389  ProductSelector::checkForDuplicateKeptBranch(desc, trueBranchIDToKeptBranchDesc);
390 
391  if (desc.branchType() == InEvent) {
392  if (desc.produced()) {
393  keptProductsInEvent.insert(desc.originalBranchID());
394  } else {
395  keptProductsInEvent.insert(desc.branchID());
396  }
397  }
398  EDGetToken token = consumes(TypeToGet{desc.unwrappedTypeID(), PRODUCT_TYPE},
399  InputTag{desc.moduleLabel(), desc.productInstanceName(), desc.processName()});
400 
401  // Now put it in the list of selected branches.
402  keptProducts_[desc.branchType()].push_back(std::make_pair(&desc, token));
403  }
404 
406  std::map<BranchID::value_type, BranchID::value_type> const& droppedBranchIDToKeptBranchID) {
407  // Check for branches dropped while an EDAlias was kept.
408  // Replace BranchID of each dropped branch with that of the kept alias.
409  for (BranchIDList& branchIDList : branchIDListHelper_->mutableBranchIDLists()) {
410  for (BranchID::value_type& branchID : branchIDList) {
411  std::map<BranchID::value_type, BranchID::value_type>::const_iterator iter =
412  droppedBranchIDToKeptBranchID.find(branchID);
413  if (iter != droppedBranchIDToKeptBranchID.end()) {
414  branchID = iter->second;
415  }
416  }
417  }
418  for_all(subProcesses_, [&droppedBranchIDToKeptBranchID](auto& subProcess) {
419  subProcess.fixBranchIDListsForEDAliases(droppedBranchIDToKeptBranchID);
420  });
421  }
422 
424  EventPrincipal const& ep,
425  std::vector<std::shared_ptr<const EventSetupImpl>> const* iEventSetupImpls) {
427  /* BEGIN relevant bits from OutputModule::doEvent */
428  if (!wantAllEvents_) {
429  EventForOutput e(ep, ModuleDescription(), nullptr);
430  e.setConsumer(this);
431  if (!selectors_.wantEvent(e)) {
432  return;
433  }
434  }
435  processAsync(std::move(iHolder), ep, iEventSetupImpls);
436  /* END relevant bits from OutputModule::doEvent */
437  }
438 
440  EventPrincipal const& principal,
441  std::vector<std::shared_ptr<const EventSetupImpl>> const* iEventSetupImpls) {
442  EventAuxiliary aux(principal.aux());
443  aux.setProcessHistoryID(principal.processHistoryID());
444 
445  EventSelectionIDVector esids{principal.eventSelectionIDs()};
446  if (principal.productRegistry().anyProductProduced() || !wantAllEvents_) {
447  esids.push_back(selector_config_id_);
448  }
449 
451  auto& processHistoryRegistry = processHistoryRegistries_[principal.streamID().value()];
452  processHistoryRegistry.registerProcessHistory(principal.processHistory());
453  BranchListIndexes bli(principal.branchListIndexes());
454  branchIDListHelper_->fixBranchListIndexes(bli);
455  bool deepCopyRetriever = false;
456  ep.fillEventPrincipal(
457  aux,
458  &principal.processHistory(),
459  std::move(esids),
460  std::move(bli),
461  principal.eventToProcessBlockIndexes(),
462  *(principal.productProvenanceRetrieverPtr()), //NOTE: this transfers the per product provenance
463  principal.reader(),
464  deepCopyRetriever);
465  ep.setLuminosityBlockPrincipal(inUseLumiPrincipals_[principal.luminosityBlockPrincipal().index()].get());
466  propagateProducts(InEvent, principal, ep);
467 
468  using namespace edm::waiting_task;
469  chain::first([&](auto nextTask) {
470  EventTransitionInfo info(ep, *((*iEventSetupImpls)[esp_->subProcessIndex()]));
471  schedule_->processOneEventAsync(std::move(nextTask), ep.streamID().value(), info, serviceToken_);
472  }) | chain::ifThen(not subProcesses_.empty(), [this, &ep, iEventSetupImpls](auto nextTask) {
473  for (auto& subProcess : boost::adaptors::reverse(subProcesses_)) {
474  subProcess.doEventAsync(nextTask, ep, iEventSetupImpls);
475  }
476  }) | chain::then([&ep](std::exception_ptr const* iPtr, auto nextTask) {
477  ep.clearEventPrincipal();
478  if (iPtr) {
479  nextTask.doneWaiting(*iPtr);
480  }
481  }) | chain::runLast(std::move(iHolder));
482  }
483 
484  template <>
485  void SubProcess::doBeginProcessBlockAsync<OccurrenceTraits<ProcessBlockPrincipal, BranchActionProcessBlockInput>>(
486  WaitingTaskHolder iHolder, ProcessBlockTransitionInfo const& iTransitionInfo, bool cleaningUpAfterException) {
488 
490  ProcessBlockPrincipal const& parentPrincipal = iTransitionInfo.principal();
491  processBlockPrincipal.fillProcessBlockPrincipal(parentPrincipal.processName(), parentPrincipal.reader());
492  propagateProducts(InProcess, parentPrincipal, processBlockPrincipal);
493 
494  ProcessBlockTransitionInfo transitionInfo(processBlockPrincipal);
496  beginGlobalTransitionAsync<Traits>(
497  std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
498  }
499 
500  template <>
501  void SubProcess::doBeginProcessBlockAsync<OccurrenceTraits<ProcessBlockPrincipal, BranchActionGlobalBegin>>(
502  WaitingTaskHolder iHolder, ProcessBlockTransitionInfo const& iTransitionInfo, bool) {
504 
506  ProcessBlockPrincipal const& parentPrincipal = iTransitionInfo.principal();
507  processBlockPrincipal.fillProcessBlockPrincipal(processConfiguration_->processName());
508  propagateProducts(InProcess, parentPrincipal, processBlockPrincipal);
509 
510  ProcessBlockTransitionInfo transitionInfo(processBlockPrincipal);
512  beginGlobalTransitionAsync<Traits>(std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_);
513  }
514 
516  ProcessBlockTransitionInfo const& iTransitionInfo,
517  bool cleaningUpAfterException) {
519  ProcessBlockPrincipal const& parentPrincipal = iTransitionInfo.principal();
520  propagateProducts(InProcess, parentPrincipal, processBlockPrincipal);
521 
522  ProcessBlockTransitionInfo transitionInfo(processBlockPrincipal);
523 
524  if (parentProducedProductIsKept(parentPrincipal, processBlockPrincipal)) {
525  ProcessBlockPrincipal& inputProcessBlockPrincipal = principalCache_.inputProcessBlockPrincipal();
526  inputProcessBlockPrincipal.fillProcessBlockPrincipal(parentPrincipal.processName(), parentPrincipal.reader());
527  propagateProducts(InProcess, parentPrincipal, inputProcessBlockPrincipal);
528  ProcessBlockTransitionInfo inputTransitionInfo(inputProcessBlockPrincipal);
529 
530  using namespace edm::waiting_task;
531  chain::first([&](const std::exception_ptr*, auto nextTask) {
533  beginGlobalTransitionAsync<TraitsInput>(std::move(nextTask),
534  *schedule_,
535  inputTransitionInfo,
538  cleaningUpAfterException);
539  }) | chain::then([this](auto nextTask) { writeProcessBlockAsync(nextTask, ProcessBlockType::Input); }) |
540  chain::then([this, info = transitionInfo, cleaningUpAfterException](std::exception_ptr const* iPtr,
541  auto nextTask) mutable {
542  ProcessBlockPrincipal& inputProcessBlockPrincipal = principalCache_.inputProcessBlockPrincipal();
543  inputProcessBlockPrincipal.clearPrincipal();
544  for (auto& s : subProcesses_) {
545  s.clearProcessBlockPrincipal(ProcessBlockType::Input);
546  }
547  if (iPtr) {
548  nextTask.doneWaiting(*iPtr);
549  } else {
551  endGlobalTransitionAsync<Traits>(
552  std::move(nextTask), *schedule_, info, serviceToken_, subProcesses_, cleaningUpAfterException);
553  }
554  }) |
555  chain::runLast(std::move(iHolder));
556  } else {
558  endGlobalTransitionAsync<Traits>(
559  std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
560  }
561  }
562 
563  void SubProcess::doBeginRunAsync(WaitingTaskHolder iHolder, RunTransitionInfo const& iTransitionInfo) {
565 
566  RunPrincipal const& parentPrincipal = iTransitionInfo.principal();
567  auto aux = parentPrincipal.aux();
568  aux.setProcessHistoryID(parentPrincipal.processHistoryID());
570  rpp->setAux(aux);
571  auto& processHistoryRegistry = processHistoryRegistries_[historyRunOffset_ + parentPrincipal.index()];
572  inUseRunPrincipals_[parentPrincipal.index()] = rpp;
573  processHistoryRegistry.registerProcessHistory(parentPrincipal.processHistory());
574  rpp->fillRunPrincipal(processHistoryRegistry, parentPrincipal.reader());
575 
576  RunPrincipal& rp = *rpp;
577  propagateProducts(InRun, parentPrincipal, rp);
578 
579  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
580  RunTransitionInfo transitionInfo(rp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
582  beginGlobalTransitionAsync<Traits>(std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_);
583  }
584 
586  RunTransitionInfo const& iTransitionInfo,
587  bool cleaningUpAfterException) {
588  RunPrincipal const& parentPrincipal = iTransitionInfo.principal();
589  RunPrincipal& rp = *inUseRunPrincipals_[parentPrincipal.index()];
590  propagateProducts(InRun, parentPrincipal, rp);
591 
592  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
593  RunTransitionInfo transitionInfo(rp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
595  endGlobalTransitionAsync<Traits>(
596  std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
597  }
598 
600  using namespace edm::waiting_task;
601  chain::first([&](std::exception_ptr const*, auto nextTask) {
603  schedule_->writeProcessBlockAsync(
604  nextTask, principalCache_.processBlockPrincipal(processBlockType), &processContext_, actReg_.get());
605  }) | chain::ifThen(not subProcesses_.empty(), [this, processBlockType](auto nextTask) {
607  for (auto& s : subProcesses_) {
608  s.writeProcessBlockAsync(nextTask, processBlockType);
609  }
611  }
612 
614  RunPrincipal const& principal,
615  MergeableRunProductMetadata const* mergeableRunProductMetadata) {
616  using namespace edm::waiting_task;
617 
618  auto rp = inUseRunPrincipals_[principal.index()];
619  chain::first([&](std::exception_ptr const*, auto nextTask) {
621  schedule_->writeRunAsync(nextTask, *rp, &processContext_, actReg_.get(), mergeableRunProductMetadata);
622  }) | chain::ifThen(not subProcesses_.empty(), [this, rp, mergeableRunProductMetadata](auto nextTask) {
623  ServiceRegistry::Operate operateWriteRun(serviceToken_);
624  for (auto& s : subProcesses_) {
625  s.writeRunAsync(nextTask, *rp, mergeableRunProductMetadata);
626  }
628  }
629 
631  //release from list but stay around till end of routine
632  auto rp = std::move(inUseRunPrincipals_[parentPrincipal.index()]);
633  for (auto& s : subProcesses_) {
634  s.clearRunPrincipal(*rp);
635  }
636  rp->clearPrincipal();
637  }
638 
640  ProcessBlockPrincipal& processBlockPrincipal = principalCache_.processBlockPrincipal(processBlockType);
641  processBlockPrincipal.clearPrincipal();
642  for (auto& s : subProcesses_) {
643  s.clearProcessBlockPrincipal(processBlockType);
644  }
645  }
646 
649 
650  LuminosityBlockPrincipal const& parentPrincipal = iTransitionInfo.principal();
651  auto aux = parentPrincipal.aux();
652  aux.setProcessHistoryID(parentPrincipal.processHistoryID());
654  lbpp->setAux(aux);
655  auto& processHistoryRegistry = processHistoryRegistries_[historyLumiOffset_ + lbpp->index()];
656  inUseLumiPrincipals_[parentPrincipal.index()] = lbpp;
657  processHistoryRegistry.registerProcessHistory(parentPrincipal.processHistory());
658  lbpp->fillLuminosityBlockPrincipal(&parentPrincipal.processHistory(), parentPrincipal.reader());
659  lbpp->setRunPrincipal(inUseRunPrincipals_[parentPrincipal.runPrincipal().index()]);
660  LuminosityBlockPrincipal& lbp = *lbpp;
661  propagateProducts(InLumi, parentPrincipal, lbp);
662 
663  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
664  LumiTransitionInfo transitionInfo(lbp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
666  beginGlobalTransitionAsync<Traits>(std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_);
667  }
668 
670  LumiTransitionInfo const& iTransitionInfo,
671  bool cleaningUpAfterException) {
672  LuminosityBlockPrincipal const& parentPrincipal = iTransitionInfo.principal();
673  LuminosityBlockPrincipal& lbp = *inUseLumiPrincipals_[parentPrincipal.index()];
674  propagateProducts(InLumi, parentPrincipal, lbp);
675 
676  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
677  LumiTransitionInfo transitionInfo(lbp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
679  endGlobalTransitionAsync<Traits>(
680  std::move(iHolder), *schedule_, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
681  }
682 
684  using namespace edm::waiting_task;
685 
686  auto l = inUseLumiPrincipals_[principal.index()];
687  chain::first([&](std::exception_ptr const*, auto nextTask) {
689  schedule_->writeLumiAsync(nextTask, *l, &processContext_, actReg_.get());
690  }) | chain::ifThen(not subProcesses_.empty(), [this, l](auto nextTask) {
691  ServiceRegistry::Operate operateWriteLumi(serviceToken_);
692  for (auto& s : subProcesses_) {
693  s.writeLumiAsync(nextTask, *l);
694  }
696  }
697 
699  //release from list but stay around till end of routine
700  auto lb = std::move(inUseLumiPrincipals_[principal.index()]);
701  for (auto& s : subProcesses_) {
702  s.clearLumiPrincipal(*lb);
703  }
704  lb->setRunPrincipal(std::shared_ptr<RunPrincipal>());
705  lb->clearPrincipal();
706  }
707 
708  void SubProcess::doBeginStream(unsigned int streamID) {
710  std::exception_ptr exceptionPtr;
711  CMS_SA_ALLOW try { schedule_->beginStream(streamID); } catch (...) {
712  exceptionPtr = std::current_exception();
713  }
714 
715  for (auto& subProcess : subProcesses_) {
716  CMS_SA_ALLOW try { subProcess.doBeginStream(streamID); } catch (...) {
717  if (!exceptionPtr) {
718  exceptionPtr = std::current_exception();
719  }
720  }
721  }
722  if (exceptionPtr) {
723  std::rethrow_exception(exceptionPtr);
724  }
725  }
726 
727  void SubProcess::doEndStream(unsigned int streamID,
728  ExceptionCollector& collector,
729  std::mutex& collectorMutex) noexcept {
731  schedule_->endStream(streamID, collector, collectorMutex);
732  for (auto& subProcess : subProcesses_) {
733  subProcess.doEndStream(streamID, collector, collectorMutex);
734  }
735  }
736 
738  unsigned int id,
739  RunTransitionInfo const& iTransitionInfo) {
741 
742  RunPrincipal const& parentPrincipal = iTransitionInfo.principal();
743  RunPrincipal& rp = *inUseRunPrincipals_[parentPrincipal.index()];
744 
745  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
746  RunTransitionInfo transitionInfo(rp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
747  beginStreamTransitionAsync<Traits>(
748  std::move(iHolder), *schedule_, id, transitionInfo, serviceToken_, subProcesses_);
749  }
750 
752  unsigned int id,
753  RunTransitionInfo const& iTransitionInfo,
754  bool cleaningUpAfterException) {
756 
757  RunPrincipal const& parentPrincipal = iTransitionInfo.principal();
758  RunPrincipal& rp = *inUseRunPrincipals_[parentPrincipal.index()];
759 
760  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
761  RunTransitionInfo transitionInfo(rp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
762  endStreamTransitionAsync<Traits>(
763  std::move(iHolder), *schedule_, id, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
764  }
765 
767  unsigned int id,
768  LumiTransitionInfo const& iTransitionInfo) {
770 
771  LuminosityBlockPrincipal& lbp = *inUseLumiPrincipals_[iTransitionInfo.principal().index()];
772  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
773  LumiTransitionInfo transitionInfo(lbp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
774  beginStreamTransitionAsync<Traits>(
775  std::move(iHolder), *schedule_, id, transitionInfo, serviceToken_, subProcesses_);
776  }
777 
779  unsigned int id,
780  LumiTransitionInfo const& iTransitionInfo,
781  bool cleaningUpAfterException) {
782  LuminosityBlockPrincipal& lbp = *inUseLumiPrincipals_[iTransitionInfo.principal().index()];
784  std::vector<std::shared_ptr<const EventSetupImpl>> const* eventSetupImpls = iTransitionInfo.eventSetupImpls();
785  LumiTransitionInfo transitionInfo(lbp, *((*eventSetupImpls)[esp_->subProcessIndex()]), eventSetupImpls);
786  endStreamTransitionAsync<Traits>(
787  std::move(iHolder), *schedule_, id, transitionInfo, serviceToken_, subProcesses_, cleaningUpAfterException);
788  }
789 
790  void SubProcess::propagateProducts(BranchType type, Principal const& parentPrincipal, Principal& principal) const {
791  SelectedProducts const& keptVector = keptProducts()[type];
792  for (auto const& item : keptVector) {
793  BranchDescription const& desc = *item.first;
794  ProductResolverBase const* parentProductResolver = parentPrincipal.getProductResolver(desc.branchID());
795  if (parentProductResolver != nullptr) {
796  ProductResolverBase* productResolver = principal.getModifiableProductResolver(desc.branchID());
797  if (productResolver != nullptr) {
798  //Propagate the per event(run)(lumi)(processBlock) data for this product to the subprocess.
799  productResolver->connectTo(*parentProductResolver, &parentPrincipal);
800  }
801  }
802  }
803  }
804 
805  bool SubProcess::parentProducedProductIsKept(Principal const& parentPrincipal, Principal& principal) const {
806  SelectedProducts const& keptVector = keptProducts()[InProcess];
807  for (auto const& item : keptVector) {
808  BranchDescription const& desc = *item.first;
809  assert(desc.branchType() == InProcess);
810  ProductResolverBase const* parentProductResolver = parentPrincipal.getProductResolver(desc.branchID());
811  if (parentProductResolver != nullptr) {
812  ProductResolverBase* productResolver = principal.getModifiableProductResolver(desc.branchID());
813  if (productResolver != nullptr) {
814  if (parentProductResolver->branchDescription().produced()) {
815  return true;
816  }
817  }
818  }
819  }
820  return false;
821  }
822 
824  branchIDListHelper_->updateFromParent(branchIDLists);
826  [this](auto& subProcess) { subProcess.updateBranchIDListHelper(branchIDListHelper_->branchIDLists()); });
827  }
828 
829  // Call respondToOpenInputFile() on all Modules
832  schedule_->respondToOpenInputFile(fb);
833  for_all(subProcesses_, [&fb](auto& subProcess) { subProcess.respondToOpenInputFile(fb); });
834  }
835 
836  // free function
838  std::vector<std::string> subProcesses =
839  parameterSet.getUntrackedParameter<std::vector<std::string>>("@all_subprocesses");
840  if (!subProcesses.empty()) {
841  return parameterSet.popVParameterSet("subProcesses");
842  }
843  return {};
844  }
845 } // namespace edm
unsigned int historyRunOffset_
Definition: SubProcess.h:287
void doStreamEndLuminosityBlockAsync(WaitingTaskHolder iHolder, unsigned int iID, LumiTransitionInfo const &, bool cleaningUpAfterException)
Definition: SubProcess.cc:778
unsigned int historyLumiOffset_
Definition: SubProcess.h:286
ParameterSetID selector_config_id_
Definition: SubProcess.h:309
std::vector< BranchDescription const * > allBranchDescriptions() const
ProductResolverBase * getModifiableProductResolver(BranchID const &oid)
Definition: Principal.h:147
void clearPrincipal()
Definition: Principal.cc:386
void addException(cms::Exception const &exception)
static const TGPicture * info(bool iBackgroundIsBlack)
void endJob(ExceptionCollector &)
Definition: SubProcess.cc:332
#define CMS_SA_ALLOW
void respondToOpenInputFile(FileBlock const &fb)
Definition: SubProcess.cc:830
SelectedProductsForBranchType const & keptProducts() const
Definition: SubProcess.h:85
std::vector< BranchIDList > BranchIDLists
Definition: BranchIDList.h:19
std::vector< ModuleDescription const * > const & allModules() const
EventAuxiliary const & aux() const
std::unique_ptr< ParameterSet > popParameterSet(std::string const &name)
std::vector< std::string > const & getAllTriggerNames()
void setNumberOfConcurrentPrincipals(PreallocationConfiguration const &)
ProductList const & productList() const
LuminosityBlockPrincipal & principal()
void clearLumiPrincipal(LuminosityBlockPrincipal &)
Definition: SubProcess.cc:698
bool parentProducedProductIsKept(Principal const &parentPrincipal, Principal &principal) const
Definition: SubProcess.cc:805
int merge(int argc, char *argv[])
Definition: DiMuonVmerge.cc:28
std::vector< ProcessHistoryRegistry > processHistoryRegistries_
Definition: SubProcess.h:288
void clearProcessBlockPrincipal(ProcessBlockType)
Definition: SubProcess.cc:639
edm::propagate_const< std::shared_ptr< ThinnedAssociationsHelper > > thinnedAssociationsHelper_
Definition: SubProcess.h:278
ProductRegistry const & productRegistry() const
Definition: Principal.h:140
std::vector< SubProcess > subProcesses_
Definition: SubProcess.h:296
edm::propagate_const< std::shared_ptr< SubProcessBlockHelper > > processBlockHelper_
Definition: SubProcess.h:277
std::shared_ptr< BranchIDListHelper const > branchIDListHelper() const
Definition: SubProcess.h:261
void writeRunAsync(WaitingTaskHolder, RunPrincipal const &, MergeableRunProductMetadata const *)
Definition: SubProcess.cc:613
void updateLookup(BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
RunPrincipal const & runPrincipal() const
static std::mutex mutex
Definition: Proxy.cc:8
PathsAndConsumesOfModules pathsAndConsumesOfModules_
Definition: SubProcess.h:283
bool exists(std::string const &parameterName) const
checks if a parameter exists
void doStreamEndRunAsync(WaitingTaskHolder iHolder, unsigned int iID, RunTransitionInfo const &, bool cleaningUpAfterException)
Definition: SubProcess.cc:751
ProcessBlockPrincipal & inputProcessBlockPrincipal() const
std::vector< ModuleProcessName > const & modulesInPreviousProcessesWhoseProductsAreConsumedBy(unsigned int moduleID) const
void updateBranchIDListHelper(BranchIDLists const &)
Definition: SubProcess.cc:823
void doBeginStream(unsigned int streamID)
Definition: SubProcess.cc:708
LuminosityBlockPrincipal const & luminosityBlockPrincipal() const
void processAsync(WaitingTaskHolder iHolder, EventPrincipal const &e, std::vector< std::shared_ptr< const EventSetupImpl >> const *)
Definition: SubProcess.cc:439
std::string_view moduleLabel() const
ParameterSet getUntrackedParameterSet(std::string const &name, ParameterSet const &defaultValue) const
std::shared_ptr< RunPrincipal > getAvailableRunPrincipalPtr()
void initialize(ProductSelectorRules const &rules, std::vector< BranchDescription const *> const &branchDescriptions)
void setParentProcessContext(ProcessContext const *parentProcessContext)
StreamID streamID() const
assert(be >=bs)
SubProcess(ParameterSet &parameterSet, ParameterSet const &topLevelParameterSet, std::shared_ptr< ProductRegistry const > parentProductRegistry, std::shared_ptr< BranchIDListHelper const > parentBranchIDListHelper, ProcessBlockHelperBase const &parentProcessBlockHelper, ThinnedAssociationsHelper const &parentThinnedAssociationsHelper, SubProcessParentageHelper const &parentSubProcessParentageHelper, eventsetup::EventSetupsController &esController, ActivityRegistry &parentActReg, ServiceToken const &token, serviceregistry::ServiceLegacy iLegacy, PreallocationConfiguration const &preallocConfig, ProcessContext const *parentProcessContext, ModuleTypeResolverMaker const *typeResolverMaker)
Definition: SubProcess.cc:53
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
std::map< BranchID::value_type, BranchID::value_type > const & droppedBranchIDToKeptBranchID()
Definition: SubProcess.h:257
constexpr auto then(O &&iO)
Definition: chain_first.h:277
edm::propagate_const< std::unique_ptr< Schedule > > schedule_
Definition: SubProcess.h:295
void doEndProcessBlockAsync(WaitingTaskHolder iHolder, ProcessBlockTransitionInfo const &iTransitionInfo, bool cleaningUpAfterException)
Definition: SubProcess.cc:515
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:112
BranchType
Definition: BranchType.h:11
std::vector< EventSelectionID > EventSelectionIDVector
std::tuple< layerClusterToCaloParticle, caloParticleToLayerCluster > association
void validateTopLevelParameterSets(ParameterSet *processParameterSet)
EventToProcessBlockIndexes const & eventToProcessBlockIndexes() const
std::vector< std::shared_ptr< RunPrincipal > > inUseRunPrincipals_
Definition: SubProcess.h:292
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::vector< std::pair< BranchDescription const *, EDGetToken > > SelectedProducts
std::shared_ptr< ThinnedAssociationsHelper const > thinnedAssociationsHelper() const
Definition: SubProcess.h:265
Func for_all(ForwardSequence &s, Func f)
wrapper for std::for_each
Definition: Algorithms.h:14
void fillProcessBlockPrincipal(std::string const &processName, DelayedReader *reader=nullptr)
bool anyProductProduced() const
ProcessBlockPrincipal & processBlockPrincipal() const
T getUntrackedParameter(std::string const &, T const &) const
void doEventAsync(WaitingTaskHolder iHolder, EventPrincipal const &principal, std::vector< std::shared_ptr< const EventSetupImpl >> const *)
Definition: SubProcess.cc:423
virtual void connectTo(ProductResolverBase const &, Principal const *)=0
ServiceToken serviceToken_
Definition: SubProcess.h:273
std::vector< BranchListIndex > BranchListIndexes
std::vector< std::shared_ptr< LuminosityBlockPrincipal > > inUseLumiPrincipals_
Definition: SubProcess.h:293
ParameterSet const & registerIt()
void doBeginLuminosityBlockAsync(WaitingTaskHolder iHolder, LumiTransitionInfo const &iTransitionInfo)
Definition: SubProcess.cc:647
~SubProcess() override
Definition: SubProcess.cc:240
auto runLast(edm::WaitingTaskHolder iTask)
Definition: chain_first.h:297
static void checkForDuplicateKeptBranch(BranchDescription const &desc, std::map< BranchID, BranchDescription const *> &trueBranchIDToKeptBranchDesc)
unsigned int value_type
Definition: BranchID.h:16
SelectedProductsForBranchType keptProducts_
Definition: SubProcess.h:303
std::vector< std::shared_ptr< const EventSetupImpl > > const * eventSetupImpls() const
void selectProducts(ProductRegistry const &preg, ThinnedAssociationsHelper const &parentThinnedAssociationsHelper, std::map< BranchID, bool > &keepAssociation)
Definition: SubProcess.cc:344
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
void connectToSubProcess(ActivityRegistry &iOther)
static void fillDroppedToKept(ProductRegistry const &preg, std::map< BranchID, BranchDescription const *> const &trueBranchIDToKeptBranchDesc, std::map< BranchID::value_type, BranchID::value_type > &droppedBranchIDToKeptBranchID_)
std::shared_ptr< EventSetupProvider > makeProvider(ParameterSet &, ActivityRegistry *, ParameterSet const *eventSetupPset=nullptr, unsigned int maxConcurrentIOVs=0, bool dumpOptions=false)
ProductSelectorRules productSelectorRules_
Definition: SubProcess.h:304
void initialize(Schedule const *, std::shared_ptr< ProductRegistry const >)
std::vector< ModuleDescription const * > nonConsumedUnscheduledModules(edm::PathsAndConsumesOfModulesBase const &iPnC, std::vector< ModuleProcessName > &consumedByChildren)
edm::propagate_const< std::shared_ptr< eventsetup::EventSetupProvider > > esp_
Definition: SubProcess.h:294
edm::propagate_const< std::unique_ptr< ParameterSet > > processParameterSet_
Definition: SubProcess.h:297
RunIndex index() const
Definition: RunPrincipal.h:56
bool configureEventSelector(edm::ParameterSet const &iPSet, std::string const &iProcessName, std::vector< std::string > const &iAllTriggerNames, edm::detail::TriggerResultsBasedEventSelector &oSelector, ConsumesCollector &&iC)
constexpr auto ifThen(bool iValue, O &&iO)
Only runs this task if the condition (which is known at the call time) is true. If false...
Definition: chain_first.h:288
void propagateProducts(BranchType type, Principal const &parentPrincipal, Principal &principal) const
Definition: SubProcess.cc:790
bool selected(BranchDescription const &desc) const
void doEndJob(ExceptionCollector &)
Definition: SubProcess.cc:299
void insert(std::unique_ptr< ProcessBlockPrincipal >)
void setProcessConfiguration(ProcessConfiguration const *processConfiguration)
std::vector< std::shared_ptr< const EventSetupImpl > > const * eventSetupImpls() const
void writeProcessBlockAsync(edm::WaitingTaskHolder task, ProcessBlockType)
Definition: SubProcess.cc:599
Log< level::Info, false > LogInfo
std::unique_ptr< ExceptionToActionTable const > act_table_
Definition: SubProcess.h:280
std::vector< ParameterSet > popSubProcessVParameterSet(ParameterSet &parameterSet)
Definition: SubProcess.cc:837
std::map< BranchID::value_type, BranchID::value_type > droppedBranchIDToKeptBranchID_
Definition: SubProcess.h:314
ProductSelector productSelector_
Definition: SubProcess.h:305
void checkForModuleDependencyCorrectness(edm::PathsAndConsumesOfModulesBase const &iPnC, bool iPrintDependencies)
detail::TriggerResultsBasedEventSelector selectors_
Definition: SubProcess.h:310
std::string const & processName() const
void doStreamBeginLuminosityBlockAsync(WaitingTaskHolder iHolder, unsigned int iID, LumiTransitionInfo const &)
Definition: SubProcess.cc:766
ProcessHistory const & processHistory() const
Definition: Principal.h:134
void doStreamBeginRunAsync(WaitingTaskHolder iHolder, unsigned int iID, RunTransitionInfo const &)
Definition: SubProcess.cc:737
std::shared_ptr< ActivityRegistry > actReg_
Definition: SubProcess.h:272
void insertForInput(std::unique_ptr< ProcessBlockPrincipal >)
ProductProvenanceRetriever const * productProvenanceRetrieverPtr() const
void doEndRunAsync(WaitingTaskHolder iHolder, RunTransitionInfo const &iTransitionInfo, bool cleaningUpAfterException)
Definition: SubProcess.cc:585
void doBeginRunAsync(WaitingTaskHolder iHolder, RunTransitionInfo const &iTransitionInfo)
Definition: SubProcess.cc:563
edm::propagate_const< std::shared_ptr< BranchIDListHelper > > branchIDListHelper_
Definition: SubProcess.h:276
ProcessBlockPrincipal & principal()
void doEndStream(unsigned int streamID, ExceptionCollector &collector, std::mutex &collectorMutex) noexcept
Definition: SubProcess.cc:727
std::vector< HistoryAppender > historyAppenders_
Definition: SubProcess.h:289
std::vector< BranchID::value_type > BranchIDList
Definition: BranchIDList.h:18
EventPrincipal & eventPrincipal(unsigned int iStreamIndex) const
std::vector< ParameterSet > popVParameterSet(std::string const &name)
HLT enums.
void selectAssociationProducts(std::vector< BranchDescription const *> const &associationDescriptions, std::set< BranchID > const &keptProductsInEvent, std::map< BranchID, bool > &keepAssociation) const
void clearRunPrincipal(RunPrincipal &)
Definition: SubProcess.cc:630
void removeModules(std::vector< ModuleDescription const *> const &modules)
std::shared_ptr< ProductRegistry const > parentPreg_
Definition: SubProcess.h:274
LuminosityBlockIndex index() const
void fixBranchIDListsForEDAliases(std::map< BranchID::value_type, BranchID::value_type > const &droppedBranchIDToKeptBranchID)
Definition: SubProcess.cc:405
ProcessHistoryID const & processHistoryID() const
Definition: Principal.h:136
EventSelectionIDVector const & eventSelectionIDs() const
bool initialized() const
ProcessContext processContext_
Definition: SubProcess.h:282
RunAuxiliary const & aux() const
Definition: RunPrincipal.h:59
std::shared_ptr< LuminosityBlockPrincipal > getAvailableLumiPrincipalPtr()
LuminosityBlockAuxiliary const & aux() const
unsigned int value() const
Definition: StreamID.h:43
std::vector< ModuleProcessName > keepOnlyConsumedUnscheduledModules(bool deleteModules)
Definition: SubProcess.cc:242
auto wrap(F iFunc) -> decltype(iFunc())
ParameterSetID registerProperSelectionInfo(edm::ParameterSet const &iInitial, std::string const &iLabel, std::map< std::string, std::vector< std::pair< std::string, int > > > const &outputModulePathPositions, bool anyProductProduced)
BranchListIndexes const & branchListIndexes() const
tmp
align.sh
Definition: createJobs.py:716
void keepThisBranch(BranchDescription const &desc, std::map< BranchID, BranchDescription const *> &trueBranchIDToKeptBranchDesc, std::set< BranchID > &keptProductsInEvent)
Definition: SubProcess.cc:386
RunPrincipal & principal()
void doEndLuminosityBlockAsync(WaitingTaskHolder iHolder, LumiTransitionInfo const &iTransitionInfo, bool cleaningUpAfterException)
Definition: SubProcess.cc:669
void writeLumiAsync(WaitingTaskHolder, LuminosityBlockPrincipal &)
Definition: SubProcess.cc:683
std::shared_ptr< ProductRegistry const > preg_
Definition: SubProcess.h:275
PrincipalCache principalCache_
Definition: SubProcess.h:290
def move(src, dest)
Definition: eostools.py:511
edm::propagate_const< std::shared_ptr< SubProcessParentageHelper > > subProcessParentageHelper_
Definition: SubProcess.h:279
DelayedReader * reader() const
Definition: Principal.h:181
std::shared_ptr< ProcessConfiguration const > processConfiguration_
Definition: SubProcess.h:281
ConstProductResolverPtr getProductResolver(BranchID const &oid) const
Definition: Principal.cc:558