CMS 3D CMS Logo

TestProcessor.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: Subsystem/Package
4 // Class : TestProcessor
5 //
6 // Implementation:
7 // [Notes on implementation]
8 //
9 // Original Author: Chris Jones
10 // Created: Mon, 30 Apr 2018 18:51:08 GMT
11 //
12 
13 // system include files
14 
15 // user include files
18 
39 
42 
46 
48 
50 
51 #include "oneTimeInitialization.h"
52 
53 #include <mutex>
54 
55 #define xstr(s) str(s)
56 #define str(s) #s
57 
58 namespace edm {
59  namespace test {
60 
61  //
62  // constructors and destructor
63  //
65  : globalControl_(oneapi::tbb::global_control::max_allowed_parallelism, 1),
66  arena_(1),
67  historyAppender_(std::make_unique<HistoryAppender>()),
68  moduleRegistry_(std::make_shared<ModuleRegistry>()) {
69  //Setup various singletons
71 
72  ProcessDescImpl desc(iConfig.pythonConfiguration(), false);
73 
74  auto psetPtr = desc.parameterSet();
76  espController_ = std::make_unique<eventsetup::EventSetupsController>(moduleTypeResolverMaker_.get());
77 
78  validateTopLevelParameterSets(psetPtr.get());
79 
81 
82  labelOfTestModule_ = psetPtr->getParameter<std::string>("@moduleToTest");
83 
84  auto procDesc = desc.processDesc();
85  // Now do general initialization
87 
88  //initialize the services
89  auto& serviceSets = procDesc->getServicesPSets();
90  ServiceToken token = items.initServices(serviceSets, *psetPtr, iToken, serviceregistry::kOverlapIsError, true);
91  serviceToken_ = items.addCPRandTNS(*psetPtr, token);
92 
93  //make the services available
95 
96  // intialize miscellaneous items
97  std::shared_ptr<CommonParams> common(items.initMisc(*psetPtr));
98 
99  // intialize the event setup provider
100  esp_ = espController_->makeProvider(*psetPtr, items.actReg_.get());
101 
102  auto nThreads = 1U;
103  auto nStreams = 1U;
104  auto nConcurrentLumis = 1U;
105  auto nConcurrentRuns = 1U;
107 
108  if (not iConfig.esProduceEntries().empty()) {
109  esHelper_ = std::make_unique<EventSetupTestHelper>(iConfig.esProduceEntries());
110  esp_->add(std::dynamic_pointer_cast<eventsetup::ESProductResolverProvider>(esHelper_));
111  esp_->add(std::dynamic_pointer_cast<EventSetupRecordIntervalFinder>(esHelper_));
112  }
113 
114  preg_ = items.preg();
115  processConfiguration_ = items.processConfiguration();
116 
117  edm::ParameterSet emptyPSet;
118  emptyPSet.registerIt();
119  auto psetid = emptyPSet.id();
120 
121  for (auto const& p : iConfig.extraProcesses()) {
122  processHistory_.emplace_back(p, psetid, xstr(PROJECT_VERSION), "0");
124  }
125 
126  //setup the products we will be adding to the event
127  for (auto const& produce : iConfig.produceEntries()) {
128  auto processName = produce.processName_;
129  if (processName.empty()) {
130  processName = processConfiguration_->processName();
131  }
132  edm::TypeWithDict twd(produce.type_.typeInfo());
134  produce.moduleLabel_,
135  processName,
136  twd.userClassName(),
137  twd.friendlyClassName(),
138  produce.instanceLabel_,
139  "",
140  psetid,
141  twd,
142  true //force this to come from 'source'
143  );
144  product.init();
145  dataProducts_.emplace_back(product, std::unique_ptr<WrapperBase>());
146  preg_->addProduct(product);
147  }
148 
149  processBlockHelper_ = std::make_shared<ProcessBlockHelper>();
150 
151  schedule_ = items.initSchedule(
153  // set the data members
154  act_table_ = std::move(items.act_table_);
155  actReg_ = items.actReg_;
156  branchIDListHelper_ = items.branchIDListHelper();
157  thinnedAssociationsHelper_ = items.thinnedAssociationsHelper();
159 
161 
162  preg_->setFrozen();
164 
165  for (unsigned int index = 0; index < preallocations_.numberOfStreams(); ++index) {
166  // Reusable event principal
167  auto ep = std::make_shared<EventPrincipal>(preg_,
171  historyAppender_.get(),
172  index);
174  }
175  for (unsigned int index = 0; index < preallocations_.numberOfRuns(); ++index) {
176  auto rp = std::make_unique<RunPrincipal>(
179  }
180  for (unsigned int index = 0; index < preallocations_.numberOfLuminosityBlocks(); ++index) {
181  auto lp =
182  std::make_unique<LuminosityBlockPrincipal>(preg_, *processConfiguration_, historyAppender_.get(), index);
184  }
185  {
186  auto pb = std::make_unique<ProcessBlockPrincipal>(preg_, *processConfiguration_);
188  }
189  }
190 
192  //
193  // member functions
194  //
195 
196  void TestProcessor::put(unsigned int index, std::unique_ptr<WrapperBase> iWrapper) {
197  if (index >= dataProducts_.size()) {
198  throw cms::Exception("LogicError") << "Products must be declared to the TestProcessor::Config object\n"
199  "with a call to the function \'produces\' BEFORE passing the\n"
200  "TestProcessor::Config object to the TestProcessor constructor";
201  }
202  dataProducts_[index].second = std::move(iWrapper);
203  }
204 
206  bool result = arena_.execute([this]() {
207  setupProcessing();
208  event();
209 
210  return schedule_->totalEventsPassed() > 0;
211  });
212  schedule_->clearCounters();
213  if (esHelper_) {
214  //We want each test to have its own ES data products
215  esHelper_->resetAllResolvers();
216  }
217  return edm::test::Event(
219  }
220 
222  arena_.execute([this, iNum]() {
223  if (not beginJobCalled_) {
224  beginJob();
225  }
228  }
229  if (not beginProcessBlockCalled_) {
231  }
232  if (not openOutputFilesCalled_) {
233  openOutputFiles();
234  }
235 
236  if (not beginRunCalled_) {
237  beginRun();
238  }
239  if (beginLumiCalled_) {
241  assert(lumiNumber_ != iNum);
242  }
243  lumiNumber_ = iNum;
245  });
246 
247  if (esHelper_) {
248  //We want each test to have its own ES data products
249  esHelper_->resetAllResolvers();
250  }
252  }
253 
255  //using a return value from arena_.execute lead to double delete of shared_ptr
256  // based on valgrind output when exception occurred. Use lambda capture instead.
257  std::shared_ptr<edm::LuminosityBlockPrincipal> lumi;
258  arena_.execute([this, &lumi]() {
259  if (not beginJobCalled_) {
260  beginJob();
261  }
264  }
265  if (not beginProcessBlockCalled_) {
267  }
268  if (not openOutputFilesCalled_) {
269  openOutputFiles();
270  }
271  if (not beginRunCalled_) {
272  beginRun();
273  }
274  if (not beginLumiCalled_) {
276  }
278  });
279  if (esHelper_) {
280  //We want each test to have its own ES data products
281  esHelper_->resetAllResolvers();
282  }
283 
285  }
286 
288  arena_.execute([this, iNum]() {
289  if (not beginJobCalled_) {
290  beginJob();
291  }
294  }
295  if (not beginProcessBlockCalled_) {
297  }
298  if (not openOutputFilesCalled_) {
299  openOutputFiles();
300  }
301  if (beginRunCalled_) {
302  assert(runNumber_ != iNum);
303  endRun();
304  }
305  runNumber_ = iNum;
306  beginRun();
307  });
308  if (esHelper_) {
309  //We want each test to have its own ES data products
310  esHelper_->resetAllResolvers();
311  }
313  }
315  //using a return value from arena_.execute lead to double delete of shared_ptr
316  // based on valgrind output when exception occurred. Use lambda capture instead.
317  std::shared_ptr<edm::RunPrincipal> rp;
318  arena_.execute([this, &rp]() {
319  if (not beginJobCalled_) {
320  beginJob();
321  }
324  }
325  if (not beginProcessBlockCalled_) {
327  }
328  if (not openOutputFilesCalled_) {
329  openOutputFiles();
330  }
331  if (not beginRunCalled_) {
332  beginRun();
333  }
334  rp = endRun();
335  });
336  if (esHelper_) {
337  //We want each test to have its own ES data products
338  esHelper_->resetAllResolvers();
339  }
340 
341  return edm::test::Run(rp, labelOfTestModule_, processConfiguration_->processName());
342  }
343 
345  arena_.execute([this]() {
346  if (not beginJobCalled_) {
347  beginJob();
348  }
350  });
353  }
355  auto pbp = arena_.execute([this]() {
356  if (not beginJobCalled_) {
357  beginJob();
358  }
359  if (not beginProcessBlockCalled_) {
361  }
362  return endProcessBlock();
363  });
365  }
366 
368  if (not beginJobCalled_) {
369  beginJob();
370  }
373  }
374  if (not beginProcessBlockCalled_) {
376  }
377  if (not openOutputFilesCalled_) {
378  openOutputFiles();
379  }
380  if (not beginRunCalled_) {
381  beginRun();
382  }
383  if (not beginLumiCalled_) {
385  }
386  }
387 
389  arena_.execute([this]() {
390  if (beginLumiCalled_) {
392  beginLumiCalled_ = false;
393  }
394  if (beginRunCalled_) {
395  endRun();
396  beginRunCalled_ = false;
397  }
400  }
402  endProcessBlock();
403  beginProcessBlockCalled_ = false;
404  }
407  openOutputFilesCalled_ = false;
408  }
409  if (beginJobCalled_) {
410  endJob();
411  }
414  task.waitNoThrow();
415  });
416  }
417 
420 
425  actReg_->preallocateSignal_(bounds);
426  schedule_->convertCurrentProcessAlias(processConfiguration_->processName());
427  PathsAndConsumesOfModules pathsAndConsumesOfModules;
428 
429  //The code assumes only modules make data in the current process
430  // Since the test os also allowed to do so, it can lead to problems.
431  //pathsAndConsumesOfModules.initialize(schedule_.get(), preg_);
432 
433  espController_->finishConfiguration();
434  actReg_->eventSetupConfigurationSignal_(esp_->recordsToResolverIndices(), processContext_);
435  //NOTE: this may throw
436  //checkForModuleDependencyCorrectness(pathsAndConsumesOfModules, false);
437 
438  schedule_->beginJob(
439  *preg_, esp_->recordsToResolverIndices(), *processBlockHelper_, pathsAndConsumesOfModules, processContext_);
440 
441  for (unsigned int i = 0; i < preallocations_.numberOfStreams(); ++i) {
442  schedule_->beginStream(i);
443  }
444  beginJobCalled_ = true;
445  }
446 
449  processBlockPrincipal.fillProcessBlockPrincipal(processConfiguration_->processName());
450 
451  std::vector<edm::SubProcess> emptyList;
452  {
453  ProcessBlockTransitionInfo transitionInfo(processBlockPrincipal);
455  FinalWaitingTask globalWaitTask{taskGroup_};
456  beginGlobalTransitionAsync<Traits>(
457  WaitingTaskHolder(taskGroup_, &globalWaitTask), *schedule_, transitionInfo, serviceToken_, emptyList);
458  globalWaitTask.wait();
459  }
461  }
462 
464  //make the services available
466 
467  edm::FileBlock fb;
468  schedule_->openOutputFiles(fb);
469  openOutputFilesCalled_ = true;
470  }
471 
474  //make the services available
476  schedule_->closeOutputFiles();
477 
478  openOutputFilesCalled_ = false;
479  }
480  }
481 
484  edm::FileBlock fb;
485  //make the services available
487  schedule_->respondToOpenInputFile(fb);
488  }
489 
492  edm::FileBlock fb;
493  //make the services available
495 
496  schedule_->respondToCloseInputFile(fb);
498  }
499  }
500 
503  runPrincipal_->clearPrincipal();
506  aux.setProcessHistoryID(processHistory_.id());
507  runPrincipal_->setAux(aux);
508 
509  runPrincipal_->fillRunPrincipal(processHistoryRegistry_);
510 
511  IOVSyncValue ts(EventID(runPrincipal_->run(), 0, 0), runPrincipal_->beginTime());
513 
514  auto const& es = esp_->eventSetupImpl();
515 
516  RunTransitionInfo transitionInfo(*runPrincipal_, es, nullptr);
517 
518  std::vector<edm::SubProcess> emptyList;
519  {
521  FinalWaitingTask globalWaitTask{taskGroup_};
522  beginGlobalTransitionAsync<Traits>(
523  WaitingTaskHolder(taskGroup_, &globalWaitTask), *schedule_, transitionInfo, serviceToken_, emptyList);
524  globalWaitTask.wait();
525  }
526  {
527  //To wait, the ref count has to be 1+#streams
528  FinalWaitingTask streamLoopWaitTask{taskGroup_};
529 
531  beginStreamsTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &streamLoopWaitTask),
532  *schedule_,
534  transitionInfo,
536  emptyList);
537  streamLoopWaitTask.wait();
538  }
539  beginRunCalled_ = true;
540  }
541 
544  aux.setProcessHistoryID(processHistory_.id());
546  lumiPrincipal_->clearPrincipal();
548  lumiPrincipal_->setAux(aux);
549 
550  lumiPrincipal_->setRunPrincipal(runPrincipal_);
551  lumiPrincipal_->fillLuminosityBlockPrincipal(&processHistory_);
552 
555 
556  auto const& es = esp_->eventSetupImpl();
557 
558  LumiTransitionInfo transitionInfo(*lumiPrincipal_, es, nullptr);
559 
560  std::vector<edm::SubProcess> emptyList;
561  {
563  FinalWaitingTask globalWaitTask{taskGroup_};
564  beginGlobalTransitionAsync<Traits>(
565  WaitingTaskHolder(taskGroup_, &globalWaitTask), *schedule_, transitionInfo, serviceToken_, emptyList);
566  globalWaitTask.wait();
567  }
568  {
569  //To wait, the ref count has to be 1+#streams
570  FinalWaitingTask streamLoopWaitTask{taskGroup_};
571 
573 
574  beginStreamsTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &streamLoopWaitTask),
575  *schedule_,
577  transitionInfo,
579  emptyList);
580 
581  streamLoopWaitTask.wait();
582  }
583  beginLumiCalled_ = true;
584  }
585 
587  auto pep = &(principalCache_.eventPrincipal(0));
588 
589  //this resets the EventPrincipal (if it had been used before)
590  pep->clearEventPrincipal();
592  aux.setProcessHistoryID(processHistory_.id());
593  pep->fillEventPrincipal(aux, nullptr, nullptr);
594  assert(lumiPrincipal_.get() != nullptr);
595  pep->setLuminosityBlockPrincipal(lumiPrincipal_.get());
596 
597  for (auto& p : dataProducts_) {
598  if (p.second) {
599  pep->put(p.first, std::move(p.second), ProductProvenance(p.first.branchID()));
600  } else {
601  //The data product was not set so we need to
602  // tell the ProductResolver not to wait
603  auto r = pep->getProductResolver(p.first.branchID());
604  dynamic_cast<ProductPutterBase const*>(r)->putProduct(std::unique_ptr<WrapperBase>());
605  }
606  }
607 
609 
610  FinalWaitingTask waitTask{taskGroup_};
611 
612  EventTransitionInfo info(*pep, esp_->eventSetupImpl());
613  schedule_->processOneEventAsync(edm::WaitingTaskHolder(taskGroup_, &waitTask), 0, info, serviceToken_);
614 
615  waitTask.wait();
616  ++eventNumber_;
617  }
618 
619  std::shared_ptr<LuminosityBlockPrincipal> TestProcessor::endLuminosityBlock() {
620  auto lumiPrincipal = lumiPrincipal_;
621  if (beginLumiCalled_) {
622  //make the services available
624 
625  beginLumiCalled_ = false;
626  lumiPrincipal_.reset();
627 
628  IOVSyncValue ts(EventID(runNumber_, lumiNumber_, eventNumber_), lumiPrincipal->endTime());
630 
631  auto const& es = esp_->eventSetupImpl();
632 
633  LumiTransitionInfo transitionInfo(*lumiPrincipal, es, nullptr);
634 
635  std::vector<edm::SubProcess> emptyList;
636 
637  //To wait, the ref count has to be 1+#streams
638  {
639  FinalWaitingTask streamLoopWaitTask{taskGroup_};
640 
642 
643  endStreamsTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &streamLoopWaitTask),
644  *schedule_,
646  transitionInfo,
648  emptyList,
649  false);
650 
651  streamLoopWaitTask.wait();
652  }
653  {
654  FinalWaitingTask globalWaitTask{taskGroup_};
655 
657  endGlobalTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &globalWaitTask),
658  *schedule_,
659  transitionInfo,
661  emptyList,
662  false);
663  globalWaitTask.wait();
664  }
665  {
666  FinalWaitingTask globalWaitTask{taskGroup_};
667  schedule_->writeLumiAsync(
668  WaitingTaskHolder(taskGroup_, &globalWaitTask), *lumiPrincipal, &processContext_, actReg_.get());
669  globalWaitTask.wait();
670  }
671  }
672  lumiPrincipal->setRunPrincipal(std::shared_ptr<RunPrincipal>());
673  return lumiPrincipal;
674  }
675 
676  std::shared_ptr<edm::RunPrincipal> TestProcessor::endRun() {
677  auto runPrincipal = runPrincipal_;
678  runPrincipal_.reset();
679  if (beginRunCalled_) {
680  beginRunCalled_ = false;
681 
682  //make the services available
684 
685  IOVSyncValue ts(
687  runPrincipal->endTime());
689 
690  auto const& es = esp_->eventSetupImpl();
691 
692  RunTransitionInfo transitionInfo(*runPrincipal, es);
693 
694  std::vector<edm::SubProcess> emptyList;
695 
696  //To wait, the ref count has to be 1+#streams
697  {
698  FinalWaitingTask streamLoopWaitTask{taskGroup_};
699 
701 
702  endStreamsTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &streamLoopWaitTask),
703  *schedule_,
705  transitionInfo,
707  emptyList,
708  false);
709 
710  streamLoopWaitTask.wait();
711  }
712  {
713  FinalWaitingTask globalWaitTask{taskGroup_};
714 
716  endGlobalTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &globalWaitTask),
717  *schedule_,
718  transitionInfo,
720  emptyList,
721  false);
722  globalWaitTask.wait();
723  }
724  {
725  FinalWaitingTask globalWaitTask{taskGroup_};
726  schedule_->writeRunAsync(WaitingTaskHolder(taskGroup_, &globalWaitTask),
727  *runPrincipal,
729  actReg_.get(),
730  runPrincipal->mergeableRunProductMetadata());
731  globalWaitTask.wait();
732  }
733  }
734  return runPrincipal;
735  }
736 
740  beginProcessBlockCalled_ = false;
741 
742  std::vector<edm::SubProcess> emptyList;
743  {
744  FinalWaitingTask globalWaitTask{taskGroup_};
745 
746  ProcessBlockTransitionInfo transitionInfo(processBlockPrincipal);
748  endGlobalTransitionAsync<Traits>(WaitingTaskHolder(taskGroup_, &globalWaitTask),
749  *schedule_,
750  transitionInfo,
752  emptyList,
753  false);
754  globalWaitTask.wait();
755  }
756  }
757  return &processBlockPrincipal;
758  }
759 
761  if (!beginJobCalled_) {
762  return;
763  }
764  beginJobCalled_ = false;
765 
766  // Collects exceptions, so we don't throw before all operations are performed.
768  "Multiple exceptions were thrown while executing endJob. An exception message follows for each.\n");
769  std::mutex collectorMutex;
770 
771  //make the services available
773 
774  //NOTE: this really should go elsewhere in the future
775  for (unsigned int i = 0; i < preallocations_.numberOfStreams(); ++i) {
776  schedule_->endStream(i, c, collectorMutex);
777  }
778  auto actReg = actReg_.get();
779  c.call([actReg]() { actReg->preEndJobSignal_(); });
780  schedule_->endJob(c);
781  c.call([actReg]() { actReg->postEndJobSignal_(); });
782  if (c.hasThrown()) {
783  c.rethrow();
784  }
785  }
786 
788  if (beginRunCalled_) {
790  endRun();
791  }
792  runNumber_ = iRun;
793  }
796  lumiNumber_ = iLumi;
797  }
798 
800 
801  } // namespace test
802 } // namespace edm
void put(std::pair< edm::EDPutTokenT< T >, std::unique_ptr< T >> &&iPut)
std::shared_ptr< LuminosityBlockPrincipal > endLuminosityBlock()
std::shared_ptr< ActivityRegistry > actReg_
void setProcessesWithMergeableRunProducts(ProductRegistry const &productRegistry)
static const TGPicture * info(bool iBackgroundIsBlack)
edm::test::ProcessBlock testBeginProcessBlockImpl()
ProcessHistoryID id() const
#define xstr(s)
void setNumberOfConcurrentPrincipals(PreallocationConfiguration const &)
std::vector< std::pair< edm::BranchDescription, std::unique_ptr< WrapperBase > > > dataProducts_
static std::mutex mutex
Definition: Proxy.cc:8
static LuminosityBlockNumber_t maxLuminosityBlockNumber()
bool registerProcessHistory(ProcessHistory const &processHistory)
LuminosityBlockNumber_t lumiNumber_
unsigned long long EventNumber_t
std::unique_ptr< edm::ModuleTypeResolverMaker const > makeModuleTypeResolverMaker(edm::ParameterSet const &pset)
edm::test::LuminosityBlock testEndLuminosityBlockImpl()
void ensureAvailableAccelerators(edm::ParameterSet const &parameterSet)
EventNumber_t eventNumber_
std::shared_ptr< RunPrincipal > getAvailableRunPrincipalPtr()
std::string const & pythonConfiguration() const
Definition: TestProcessor.h:97
std::shared_ptr< RunPrincipal > runPrincipal_
assert(be >=bs)
ProcessContext processContext_
edm::test::Run testBeginRunImpl(edm::RunNumber_t iNum, std::pair< edm::test::ESPutTokenT< T >, std::unique_ptr< T >> &&iPut, U &&... iArgs)
unsigned int LuminosityBlockNumber_t
oneapi::tbb::task_group taskGroup_
PreallocationConfiguration preallocations_
TEMPL(T2) struct Divides void
Definition: Factorize.h:24
void validateTopLevelParameterSets(ParameterSet *processParameterSet)
~TestProcessor() noexcept(false)
void synchronousEventSetupForInstance(IOVSyncValue const &syncValue, oneapi::tbb::task_group &iGroup, eventsetup::EventSetupsController &espController)
void fillProcessBlockPrincipal(std::string const &processName, DelayedReader *reader=nullptr)
ProcessBlockPrincipal & processBlockPrincipal() const
std::unique_ptr< ModuleTypeResolverMaker const > moduleTypeResolverMaker_
std::vector< std::string > const & extraProcesses() const
void setEventNumber(edm::EventNumber_t)
std::shared_ptr< BranchIDListHelper > branchIDListHelper_
ParameterSetID id() const
ParameterSet const & registerIt()
std::shared_ptr< EventSetupTestHelper > esHelper_
std::shared_ptr< ThinnedAssociationsHelper > thinnedAssociationsHelper_
std::string labelOfTestModule_
std::unique_ptr< eventsetup::EventSetupsController > espController_
edm::test::Event testImpl()
std::shared_ptr< eventsetup::EventSetupProvider > esp_
std::unique_ptr< Schedule > schedule_
std::shared_ptr< ProcessConfiguration const > processConfiguration_
edm::test::LuminosityBlock testBeginLuminosityBlockImpl(edm::LuminosityBlockNumber_t iNum, std::pair< edm::test::ESPutTokenT< T >, std::unique_ptr< T >> &&iPut, U &&... iArgs)
edm::test::ProcessBlock testEndProcessBlockImpl()
void insert(std::unique_ptr< ProcessBlockPrincipal >)
std::vector< ProduceEntry > const & produceEntries() const
std::vector< ESProduceEntry > const & esProduceEntries() const
void setProcessConfiguration(ProcessConfiguration const *processConfiguration)
void setLuminosityBlockNumber(edm::LuminosityBlockNumber_t)
PrincipalCache principalCache_
ProcessBlockPrincipal const * endProcessBlock()
std::shared_ptr< ProductRegistry > preg_
MergeableRunProductProcesses mergeableRunProductProcesses_
std::unique_ptr< ExceptionToActionTable const > act_table_
static EventNumber_t maxEventNumber()
Definition: EventID.h:96
ProcessHistory processHistory_
oneapi::tbb::task_arena arena_
EventPrincipal & eventPrincipal(unsigned int iStreamIndex) const
edm::test::Run testEndRunImpl()
void setRunNumber(edm::RunNumber_t)
HLT enums.
std::unique_ptr< HistoryAppender > historyAppender_
void emplace_back(Args &&... args)
Definition: Config.py:1
TestProcessor(Config const &iConfig, ServiceToken iToken=ServiceToken())
std::shared_ptr< LuminosityBlockPrincipal > getAvailableLumiPrincipalPtr()
unsigned int RunNumber_t
std::shared_ptr< LuminosityBlockPrincipal > lumiPrincipal_
std::shared_ptr< ProcessBlockHelper > processBlockHelper_
ProcessHistoryRegistry processHistoryRegistry_
std::shared_ptr< RunPrincipal > endRun()
def move(src, dest)
Definition: eostools.py:511