42 #include <fmt/format.h> 52 template <
typename InputIterator,
typename ForwardIterator,
typename Func>
53 void transform_into(InputIterator begin, InputIterator end, ForwardIterator
out, Func
func) {
63 template <
typename FROM,
typename TO,
typename FUNC>
64 void fill_summary(FROM
const& from, TO&
to, FUNC
func) {
65 if (
to.size() != from.size()) {
67 transform_into(from.begin(), from.end(),
temp.begin(),
func);
70 transform_into(from.begin(), from.end(),
to.begin(),
func);
80 std::shared_ptr<ActivityRegistry> areg,
81 std::shared_ptr<TriggerResultInserter> inserter) {
84 ptr->setActivityRegistry(areg);
88 void initializeBranchToReadingWorker(std::vector<std::string>
const& branchesToDeleteEarly,
89 ProductRegistry
const& preg,
90 std::multimap<std::string, Worker*>& branchToReadingWorker) {
91 auto vBranchesToDeleteEarly = branchesToDeleteEarly;
93 std::sort(vBranchesToDeleteEarly.begin(), vBranchesToDeleteEarly.end(), std::less<std::string>());
94 vBranchesToDeleteEarly.erase(
std::unique(vBranchesToDeleteEarly.begin(), vBranchesToDeleteEarly.end()),
95 vBranchesToDeleteEarly.end());
98 auto allBranchNames = preg.allBranchNames();
100 for (
auto&
b : allBranchNames) {
101 b.resize(
b.size() - 1);
103 std::sort(allBranchNames.begin(), allBranchNames.end(), std::less<std::string>());
104 std::vector<std::string>
temp;
105 temp.reserve(vBranchesToDeleteEarly.size());
108 vBranchesToDeleteEarly.end(),
109 allBranchNames.begin(),
110 allBranchNames.end(),
111 std::back_inserter(
temp));
112 vBranchesToDeleteEarly.swap(
temp);
113 if (
temp.size() != vBranchesToDeleteEarly.size()) {
114 std::vector<std::string> missingProducts;
117 vBranchesToDeleteEarly.begin(),
118 vBranchesToDeleteEarly.end(),
119 std::back_inserter(missingProducts));
120 LogInfo l(
"MissingProductsForCanDeleteEarly");
121 l <<
"The following products in the 'canDeleteEarly' list are not available in this job and will be ignored.";
122 for (
auto const&
n : missingProducts) {
128 for (
auto const&
branch : vBranchesToDeleteEarly) {
129 branchToReadingWorker.insert(std::make_pair(
branch, static_cast<Worker*>(
nullptr)));
135 WorkerManager& workerManager,
136 ProductRegistry& preg,
137 PreallocationConfiguration
const* prealloc,
138 std::shared_ptr<ProcessConfiguration const> processConfiguration) {
141 if (modpset ==
nullptr) {
146 return workerManager.getWorker(*modpset, preg, prealloc, processConfiguration,
moduleLabel);
155 template <
typename T>
156 auto findConditionalTaskModulesRange(
T& modnames) {
157 auto beg =
std::find(modnames.begin(), modnames.end(),
"#");
158 if (beg == modnames.end()) {
159 return std::pair(modnames.end(), modnames.end());
161 return std::pair(beg + 1, std::prev(modnames.end()));
164 std::optional<std::string> findBestMatchingAlias(
165 std::unordered_multimap<std::string, edm::BranchDescription const*>
const& conditionalModuleBranches,
166 std::unordered_multimap<std::string, StreamSchedule::AliasInfo>
const& aliasMap,
168 ConsumesInfo
const& consumesInfo) {
169 std::optional<std::string>
best;
171 bool bestIsAmbiguous =
false;
173 auto updateBest = [&
best, &wildcardsInBest, &bestIsAmbiguous](
175 int const wildcards =
static_cast<int>(instanceIsWildcard) + static_cast<int>(typeIsWildcard);
176 if (wildcards == 0) {
177 bestIsAmbiguous =
false;
180 if (not best
or wildcards < wildcardsInBest) {
182 wildcardsInBest = wildcards;
183 bestIsAmbiguous =
false;
184 }
else if (best and *best !=
label and wildcardsInBest == wildcards) {
185 bestIsAmbiguous =
true;
190 auto findAlias = aliasMap.equal_range(productModuleLabel);
191 for (
auto it = findAlias.first; it != findAlias.second; ++it) {
193 it->second.instanceLabel !=
"*" ? it->second.instanceLabel : it->second.originalInstanceLabel;
194 bool const instanceIsWildcard = (aliasInstanceLabel ==
"*");
195 if (instanceIsWildcard
or consumesInfo.instance() == aliasInstanceLabel) {
196 bool const typeIsWildcard = it->second.friendlyClassName ==
"*";
197 if (typeIsWildcard
or (consumesInfo.type().friendlyClassName() == it->second.friendlyClassName)) {
198 if (updateBest(it->second.originalModuleLabel, instanceIsWildcard, typeIsWildcard)) {
199 return it->second.originalModuleLabel;
204 auto branches = conditionalModuleBranches.equal_range(productModuleLabel);
205 for (
auto itBranch = branches.first; itBranch != branches.second; ++it) {
206 if (typeIsWildcard
or itBranch->second->productInstanceName() == it->second.originalInstanceLabel) {
208 TypeID(itBranch->second->wrappedType().typeInfo()),
209 itBranch->second->className())) {
210 if (updateBest(it->second.originalModuleLabel, instanceIsWildcard, typeIsWildcard)) {
211 return it->second.originalModuleLabel;
219 if (bestIsAmbiguous) {
221 <<
"Encountered ambiguity when trying to find a best-matching alias for\n" 222 <<
" friendly class name " << consumesInfo.type().friendlyClassName() <<
"\n" 223 <<
" module label " << productModuleLabel <<
"\n" 224 <<
" product instance name " << consumesInfo.instance() <<
"\n" 225 <<
"when processing EDAliases for modules in ConditionalTasks. Two aliases have the same number of " 227 << wildcardsInBest <<
")";
235 typedef std::vector<std::string>
vstring;
246 std::shared_ptr<ProcessConfiguration const> processConfiguration,
248 std::vector<std::string>
const& trigPathNames) {
249 std::unordered_set<std::string> allConditionalMods;
250 for (
auto const&
pathName : trigPathNames) {
254 auto condRange = findConditionalTaskModulesRange(modnames);
255 if (condRange.first == condRange.second)
259 allConditionalMods.insert(condRange.first, condRange.second);
262 for (
auto const&
cond : allConditionalMods) {
264 (
void)getWorker(
cond, proc_pset, workerManager, preg, prealloc, processConfiguration);
272 if (allConditionalMods.find(
prod.first.moduleLabel()) != allConditionalMods.end()) {
281 std::unordered_set<std::string>
const& conditionalmods)
const {
282 std::unordered_multimap<std::string, edm::BranchDescription const*>
ret;
283 for (
auto const&
mod : conditionalmods) {
292 auto aliases = proc_pset.
getParameter<std::vector<std::string>>(
"@all_aliases");
294 for (
auto const&
alias : aliases) {
296 auto aliasedToModuleLabels =
info.getParameterNames();
297 for (
auto const&
mod : aliasedToModuleLabels) {
298 if (not
mod.empty() and
mod[0] !=
'@' and allConditionalMods.find(
mod) != allConditionalMods.end()) {
299 auto aliasVPSet =
info.getParameter<std::vector<edm::ParameterSet>>(
mod);
300 for (
auto const& aliasPSet : aliasVPSet) {
304 if (aliasPSet.exists(
"type")) {
307 if (aliasPSet.exists(
"toProductInstance")) {
310 if (aliasPSet.exists(
"fromProductInstance")) {
311 originalInstance = aliasPSet.getParameter<
std::string>(
"fromProductInstance");
324 std::unordered_set<std::string>
const& allConditionalMods) {
325 auto const& all_modules = proc_pset.
getParameter<std::vector<std::string>>(
"@all_modules");
326 std::vector<std::string> switchEDAliases;
327 for (
auto const&
module : all_modules) {
329 if (mod_pset.getParameter<
std::string>(
"@module_type") ==
"SwitchProducer") {
330 auto const& all_cases = mod_pset.
getParameter<std::vector<std::string>>(
"@all_cases");
331 for (
auto const& case_label : all_cases) {
334 switchEDAliases.push_back(case_label);
340 switchEDAliases, allConditionalMods, proc_pset, processConfiguration.
processName(), preg);
343 std::unordered_multimap<std::string, AliasInfo>
aliasMap_;
350 std::shared_ptr<TriggerResultInserter> inserter,
353 std::shared_ptr<ModuleRegistry> modReg,
359 std::shared_ptr<ActivityRegistry> areg,
360 std::shared_ptr<ProcessConfiguration const> processConfiguration,
363 : workerManager_(modReg, areg,
actions),
371 number_of_unscheduled_modules_(0),
373 streamContext_(streamID_, processContext),
374 skippingEvent_(
false) {
375 bool hasPath =
false;
376 std::vector<std::string>
const& pathNames = tns.
getTrigPaths();
377 std::vector<std::string>
const& endPathNames = tns.
getEndPaths();
380 proc_pset, preg, &prealloc, processConfiguration,
workerManager_, pathNames);
384 for (
auto const& trig_name : pathNames) {
388 processConfiguration,
393 conditionalTaskHelper);
409 for (
auto const& end_path_name : endPathNames) {
411 proc_pset, preg, &prealloc, processConfiguration, bitpos, end_path_name, endPathNames, conditionalTaskHelper);
418 std::set<std::string> usedWorkerLabels;
420 usedWorkerLabels.insert(worker->description()->moduleLabel());
422 std::vector<std::string> modulesInConfig(proc_pset.
getParameter<std::vector<std::string>>(
"@all_modules"));
423 std::set<std::string> modulesInConfigSet(modulesInConfig.begin(), modulesInConfig.end());
424 std::vector<std::string> unusedLabels;
426 modulesInConfigSet.end(),
427 usedWorkerLabels.begin(),
428 usedWorkerLabels.end(),
429 back_inserter(unusedLabels));
430 std::set<std::string> unscheduledLabels;
431 std::vector<std::string> shouldBeUsedLabels;
432 if (!unusedLabels.empty()) {
437 for (
auto const&
label : unusedLabels) {
441 assert(modulePSet !=
nullptr);
443 *modulePSet, preg, &prealloc, processConfiguration,
label, unscheduledLabels, shouldBeUsedLabels);
445 if (!shouldBeUsedLabels.empty()) {
446 std::ostringstream unusedStream;
447 unusedStream <<
"'" << shouldBeUsedLabels.front() <<
"'";
448 for (std::vector<std::string>::iterator itLabel = shouldBeUsedLabels.begin() + 1,
449 itLabelEnd = shouldBeUsedLabels.end();
450 itLabel != itLabelEnd;
452 unusedStream <<
",'" << *itLabel <<
"'";
454 LogInfo(
"path") <<
"The following module labels are not assigned to any path:\n" << unusedStream.str() <<
"\n";
461 std::vector<std::string>
const& branchesToDeleteEarly,
462 std::multimap<std::string, std::string>
const& referencesToBranches,
463 std::vector<std::string>
const& modulesToSkip,
466 std::multimap<std::string, Worker*> branchToReadingWorker;
467 initializeBranchToReadingWorker(branchesToDeleteEarly, preg, branchToReadingWorker);
469 const std::vector<std::string>
kEmpty;
470 std::map<Worker*, unsigned int> reserveSizeForWorker;
471 unsigned int upperLimitOnReadingWorker = 0;
472 unsigned int upperLimitOnIndicies = 0;
473 unsigned int nUniqueBranchesToDelete = branchToReadingWorker.size();
479 if (!branchToReadingWorker.empty()) {
485 auto found = branchToReadingWorker.equal_range(
desc.branchName());
487 --nUniqueBranchesToDelete;
488 branchToReadingWorker.erase(
found.first,
found.second);
495 if (branchToReadingWorker.empty()) {
499 std::unordered_set<std::string> modulesToExclude(modulesToSkip.begin(), modulesToSkip.end());
501 if (modulesToExclude.end() != modulesToExclude.find(
w->description()->moduleLabel())) {
505 auto consumes =
w->consumesInfo();
506 if (not consumes.empty()) {
507 bool foundAtLeastOneMatchingBranch =
false;
508 for (
auto const& product : consumes) {
510 product.type().friendlyClassName(),
511 product.label().data(),
512 product.instance().data(),
513 product.process().data());
516 auto found = branchToReadingWorker.end();
517 if (product.process().empty()) {
518 auto startFound = branchToReadingWorker.lower_bound(
branch);
519 if (startFound != branchToReadingWorker.end()) {
520 if (startFound->first.substr(0,
branch.size()) ==
branch) {
526 auto exactFound = branchToReadingWorker.equal_range(
branch);
527 if (exactFound.first != exactFound.second) {
528 found = exactFound.first;
531 if (
found != branchToReadingWorker.end()) {
532 if (not foundAtLeastOneMatchingBranch) {
533 ++upperLimitOnReadingWorker;
534 foundAtLeastOneMatchingBranch =
true;
536 ++upperLimitOnIndicies;
537 ++reserveSizeForWorker[
w];
538 if (
nullptr ==
found->second) {
541 branchToReadingWorker.insert(make_pair(
found->first,
w));
547 auto found = referencesToBranches.end();
548 if (product.process().empty()) {
549 auto startFound = referencesToBranches.lower_bound(
branch);
550 if (startFound != referencesToBranches.end()) {
551 if (startFound->first.substr(0,
branch.size()) ==
branch) {
558 auto exactFound = referencesToBranches.equal_range(
branch);
559 if (exactFound.first != exactFound.second) {
560 found = exactFound.first;
563 if (
found != referencesToBranches.end()) {
564 for (
auto itr =
found; (itr != referencesToBranches.end()) and (itr->first ==
found->first); ++itr) {
565 auto foundInBranchToReadingWorker = branchToReadingWorker.find(itr->second);
566 if (foundInBranchToReadingWorker == branchToReadingWorker.end()) {
569 if (not foundAtLeastOneMatchingBranch) {
570 ++upperLimitOnReadingWorker;
571 foundAtLeastOneMatchingBranch =
true;
573 ++upperLimitOnIndicies;
574 ++reserveSizeForWorker[
w];
575 if (
nullptr == foundInBranchToReadingWorker->second) {
576 foundInBranchToReadingWorker->second =
w;
578 branchToReadingWorker.insert(make_pair(itr->second,
w));
587 auto it = branchToReadingWorker.begin();
588 std::vector<std::string> unusedBranches;
589 while (it != branchToReadingWorker.end()) {
590 if (it->second ==
nullptr) {
591 unusedBranches.push_back(it->first);
595 branchToReadingWorker.erase(
temp);
600 if (not unusedBranches.empty()) {
602 l <<
"The following products in the 'canDeleteEarly' list are not used in this job and will be ignored.\n" 603 " If possible, remove the producer from the job.";
604 for (
auto const&
n : unusedBranches) {
609 if (!branchToReadingWorker.empty()) {
613 std::map<const Worker*, EarlyDeleteHelper*> alreadySeenWorkers;
615 size_t nextOpenIndex = 0;
617 for (
auto& branchAndWorker : branchToReadingWorker) {
618 if (lastBranchName != branchAndWorker.first) {
620 BranchID bid(branchAndWorker.first +
".");
622 lastBranchName = branchAndWorker.first;
624 auto found = alreadySeenWorkers.find(branchAndWorker.second);
625 if (alreadySeenWorkers.end() ==
found) {
630 size_t index = nextOpenIndex;
631 size_t nIndices = reserveSizeForWorker[branchAndWorker.second];
636 alreadySeenWorkers.insert(std::make_pair(branchAndWorker.second, &(
earlyDeleteHelpers_.back())));
637 nextOpenIndex += nIndices;
647 if (itLast->end() != it->begin()) {
649 unsigned int delta = it->begin() - itLast->end();
650 it->shiftIndexPointers(
delta);
664 p.setEarlyDeleteHelpers(alreadySeenWorkers);
667 p.setEarlyDeleteHelpers(alreadySeenWorkers);
675 std::unordered_set<std::string>& conditionalModules,
676 std::unordered_multimap<std::string, edm::BranchDescription const*>
const& conditionalModuleBranches,
677 std::unordered_multimap<std::string, AliasInfo>
const& aliasMap,
681 std::shared_ptr<ProcessConfiguration const> processConfiguration) {
682 std::vector<Worker*> returnValue;
685 using namespace productholderindexhelper;
686 for (
auto const& ci : consumesInfo) {
687 if (not ci.skipCurrentProcess() and
688 (ci.process().empty()
or ci.process() == processConfiguration->processName())) {
690 bool productFromConditionalModule =
false;
691 auto itFound = conditionalModules.find(productModuleLabel);
692 if (itFound == conditionalModules.end()) {
695 auto foundAlias = findBestMatchingAlias(conditionalModuleBranches, aliasMap, productModuleLabel, ci);
697 productModuleLabel = *foundAlias;
698 productFromConditionalModule =
true;
699 itFound = conditionalModules.find(productModuleLabel);
701 if (itFound == conditionalModules.end()) {
707 auto findBranches = conditionalModuleBranches.equal_range(productModuleLabel);
708 for (
auto itBranch = findBranches.first; itBranch != findBranches.second; ++itBranch) {
709 if (itBranch->second->productInstanceName() == ci.instance()) {
711 if (ci.type() == itBranch->second->unwrappedTypeID()) {
712 productFromConditionalModule =
true;
718 ci.type(),
TypeID(itBranch->second->wrappedType().typeInfo()), itBranch->second->
className())) {
719 productFromConditionalModule =
true;
726 if (productFromConditionalModule) {
728 getWorker(productModuleLabel, proc_pset,
workerManager_, preg, prealloc, processConfiguration);
731 conditionalModules.erase(itFound);
735 conditionalModuleBranches,
740 processConfiguration);
741 returnValue.insert(returnValue.end(), dependents.begin(), dependents.end());
742 returnValue.push_back(condWorker);
752 std::shared_ptr<ProcessConfiguration const> processConfiguration,
756 std::vector<std::string>
const& endPathNames,
762 auto condRange = findConditionalTaskModulesRange(modnames);
764 std::unordered_set<std::string> conditionalmods;
766 std::unordered_multimap<std::string, edm::BranchDescription const*> conditionalModsBranches;
767 std::unordered_map<std::string, unsigned int> conditionalModOrder;
768 if (condRange.first != condRange.second) {
769 for (
auto it = condRange.first; it != condRange.second; ++it) {
771 conditionalModOrder.emplace(*it, it - modnames.begin() - 1);
774 conditionalmods = std::unordered_set<std::string>(std::make_move_iterator(condRange.first),
775 std::make_move_iterator(condRange.second));
778 modnames.erase(std::prev(condRange.first), modnames.end());
781 unsigned int placeInPath = 0;
782 for (
auto const&
name : modnames) {
784 bool doNotRunConcurrently =
false;
786 if (
name[0] ==
'!') {
788 }
else if (
name[0] ==
'-' or name[0] ==
'+') {
793 doNotRunConcurrently =
true;
802 if (worker ==
nullptr) {
808 <<
"The unknown module label \"" <<
moduleLabel <<
"\" appears in " << pathType <<
" \"" <<
pathName 809 <<
"\"\n please check spelling or remove that label from the path.";
820 <<
"' with module label '" <<
moduleLabel <<
"' appears on EndPath '" 822 <<
"The return value of the filter will be ignored.\n" 823 <<
"To suppress this warning, either remove the filter from the endpath,\n" 824 <<
"or explicitly ignore it in the configuration by using cms.ignore().\n";
827 bool runConcurrently = not doNotRunConcurrently;
829 runConcurrently =
false;
834 conditionalModsBranches,
839 processConfiguration);
840 for (
auto condMod : condModules) {
841 tmpworkers.emplace_back(
842 condMod,
WorkerInPath::Ignore, conditionalModOrder[condMod->description()->moduleLabel()],
true);
845 tmpworkers.emplace_back(worker, filterAction, placeInPath, runConcurrently);
849 out.swap(tmpworkers);
855 std::shared_ptr<ProcessConfiguration const> processConfiguration,
859 std::vector<std::string>
const& endPathNames,
863 proc_pset, preg, prealloc, processConfiguration,
name,
false, tmpworkers, endPathNames, conditionalTaskHelper);
866 if (!tmpworkers.empty()) {
887 std::shared_ptr<ProcessConfiguration const> processConfiguration,
890 std::vector<std::string>
const& endPathNames,
894 proc_pset, preg, prealloc, processConfiguration,
name,
true, tmpworkers, endPathNames, conditionalTaskHelper);
896 if (!tmpworkers.empty()) {
922 if (worker->description()->moduleLabel() == iLabel) {
927 if (
nullptr ==
found) {
938 std::vector<ModuleDescription const*>
result;
974 results_->at(empty_trig_path) = hltPathStatus;
975 pathStatusInserters[empty_trig_path]->setPathStatus(
streamID_, hltPathStatus);
997 auto pathErrorHolder = std::make_unique<std::atomic<std::exception_ptr*>>(
nullptr);
998 auto pathErrorPtr = pathErrorHolder.get();
1001 [iTask,
this, weakToken, pathError =
std::move(pathErrorHolder)](std::exception_ptr
const* iPtr)
mutable {
1004 std::exception_ptr ptr;
1005 if (pathError->load()) {
1006 ptr = *pathError->load();
1007 delete pathError->load();
1009 if ((not ptr) and iPtr) {
1019 auto pathsDone =
make_waiting_task([allPathsHolder, pathErrorPtr, transitionInfo =
info,
this, weakToken](
1020 std::exception_ptr
const* iPtr)
mutable {
1026 pathErrorPtr->store(
new std::exception_ptr(*iPtr));
1065 *(iExcept.load()) = std::exception_ptr();
1067 *(iExcept.load()) = std::current_exception();
1070 *(iExcept.load()) = std::current_exception();
1074 if ((not iExcept) and
results_->accept()) {
1088 std::rethrow_exception(expt);
1093 std::ostringstream ost;
1094 ost <<
"Processing Event " <<
info.principal().id();
1097 iExcept.store(
new std::exception_ptr(std::current_exception()));
1101 iExcept.store(
new std::exception_ptr(std::current_exception()));
1105 std::exception_ptr ptr;
1107 ptr = *iExcept.load();
1120 bool const cleaningUpAfterException =
false;
1126 iExcept = std::current_exception();
1134 iExcept = std::current_exception();
1148 std::back_inserter(oLabelsToFill),
1149 std::bind(&
Path::name, std::placeholders::_1));
1153 TrigPaths::const_iterator itFound = std::find_if(
1156 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1158 oLabelsToFill.reserve(itFound->size());
1159 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1160 oLabelsToFill.push_back(itFound->getWorker(
i)->description()->moduleLabel());
1166 std::vector<ModuleDescription const*>& descriptions,
1167 unsigned int hint)
const {
1168 descriptions.clear();
1170 TrigPaths::const_iterator itFound;
1174 if (itFound->name() == iPathLabel)
1179 itFound = std::find_if(
1182 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1187 descriptions.reserve(itFound->size());
1188 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1189 descriptions.push_back(itFound->getWorker(
i)->description());
1195 std::vector<ModuleDescription const*>& descriptions,
1196 unsigned int hint)
const {
1197 descriptions.clear();
1199 TrigPaths::const_iterator itFound;
1203 if (itFound->name() == iEndPathLabel)
1208 itFound = std::find_if(
1211 std::bind(std::equal_to<std::string>(), iEndPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1216 descriptions.reserve(itFound->size());
1217 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1218 descriptions.push_back(itFound->getWorker(
i)->description());
1242 std::vector<ModuleInPathSummary>
temp(sz);
1243 for (
size_t i = 0;
i != sz; ++
i) {
1249 for (
size_t i = 0;
i != sz; ++
i) {
1277 using std::placeholders::_1;
1310 unsigned int indexEmpty = 0;
1311 unsigned int indexOfPath = 0;
1312 for (
auto& pathStatusInserter : pathStatusInserters) {
1313 std::shared_ptr<PathStatusInserter> inserterPtr =
get_underlying(pathStatusInserter);
1317 workerPtr->setActivityRegistry(
actReg_);
1326 trig_paths_.at(indexOfPath).setPathStatusInserter(inserterPtr.get(), workerPtr.get());
1335 for (
auto& endPathStatusInserter : endPathStatusInserters) {
1336 std::shared_ptr<EndPathStatusInserter> inserterPtr =
get_underlying(endPathStatusInserter);
1340 workerPtr->setActivityRegistry(
actReg_);
1349 end_paths_.at(indexOfPath).setPathStatusInserter(
nullptr, workerPtr.get());
static void fillModuleInPathSummary(Path const &path, size_t which, ModuleInPathSummary &sum)
void initializeEarlyDelete(ModuleRegistry &modReg, std::vector< std::string > const &branchesToDeleteEarly, std::multimap< std::string, std::string > const &referencesToBranches, std::vector< std::string > const &modulesToSkip, edm::ProductRegistry const &preg)
void moduleDescriptionsInEndPath(std::string const &iEndPathLabel, std::vector< ModuleDescription const *> &descriptions, unsigned int hint) const
ExceptionToActionTable const & actionTable() const
returns the action table
T getParameter(std::string const &) const
void fillTrigPath(ParameterSet &proc_pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration, int bitpos, std::string const &name, TrigResPtr, std::vector< std::string > const &endPathNames, ConditionalTaskHelper const &conditionalTaskHelper)
std::vector< int > empty_trig_paths_
roAction_t actions[nactions]
std::vector< edm::propagate_const< WorkerPtr > > pathStatusInserterWorkers_
void endStream(StreamID iID, StreamContext &streamContext)
virtual void replaceModuleFor(Worker *) const =0
ProductList const & productList() const
std::unordered_multimap< std::string, AliasInfo > const & aliasMap() const
void processAccumulatorsAsync(WaitingTaskHolder, typename T::TransitionInfoType const &, ServiceToken const &, StreamID, ParentContext const &, typename T::Context const *)
std::array< SelectedProducts, NumBranchTypes > SelectedProductsForBranchType
static PFTauRenderPlugin instance
std::shared_ptr< HLTGlobalStatus > TrigResPtr
WorkersInPath::size_type size_type
int totalEventsPassed() const
ret
prodAgent to be discontinued
void modulesInPath(std::string const &iPathLabel, std::vector< std::string > &oLabelsToFill) const
adds to oLabelsToFill in execution order the labels of all modules in path iPathLabel ...
void processOneEventAsync(WaitingTaskHolder iTask, EventTransitionInfo &, ServiceToken const &token, std::vector< edm::propagate_const< std::shared_ptr< PathStatusInserter >>> &pathStatusInserters)
std::vector< BranchToCount > earlyDeleteBranchToCount_
std::unordered_multimap< std::string, AliasInfo > aliasMap_
void setupOnDemandSystem(EventTransitionInfo const &)
void addContextAndPrintException(char const *context, cms::Exception &ex, bool disablePrint)
void addToAllWorkers(Worker *w)
std::string const & moduleName() const
StreamSchedule(std::shared_ptr< TriggerResultInserter > inserter, std::vector< edm::propagate_const< std::shared_ptr< PathStatusInserter >>> &pathStatusInserters, std::vector< edm::propagate_const< std::shared_ptr< EndPathStatusInserter >>> &endPathStatusInserters, std::shared_ptr< ModuleRegistry >, ParameterSet &proc_pset, service::TriggerNamesService const &tns, PreallocationConfiguration const &prealloc, ProductRegistry &pregistry, ExceptionToActionTable const &actions, std::shared_ptr< ActivityRegistry > areg, std::shared_ptr< ProcessConfiguration const > processConfiguration, StreamID streamID, ProcessContext const *processContext)
std::vector< Worker * > tryToPlaceConditionalModules(Worker *, std::unordered_set< std::string > &conditionalModules, std::unordered_multimap< std::string, edm::BranchDescription const *> const &conditionalModuleBranches, std::unordered_multimap< std::string, AliasInfo > const &aliasMap, ParameterSet &proc_pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration)
edm::propagate_const< WorkerPtr > results_inserter_
void deleteModuleIfExists(std::string const &moduleLabel)
std::shared_ptr< Worker > WorkerPtr
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
StreamID streamID() const
ConditionalTaskHelper(ParameterSet &proc_pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration, WorkerManager &workerManager, std::vector< std::string > const &trigPathNames)
unsigned int number_of_unscheduled_modules_
int totalEventsFailed() const
TEMPL(T2) struct Divides void
WorkerManager workerManager_
std::shared_ptr< ActivityRegistry > actReg_
Func for_all(ForwardSequence &s, Func f)
wrapper for std::for_each
T getUntrackedParameter(std::string const &, T const &) const
constexpr element_type const * get() const
oneapi::tbb::task_group * group() const noexcept
void processEDAliases(std::vector< std::string > const &aliasNamesToProcess, std::unordered_set< std::string > const &aliasModulesToProcess, ParameterSet const &proc_pset, std::string const &processName, ProductRegistry &preg)
std::vector< WorkerInPath > PathWorkers
std::vector< int > empty_end_paths_
void doneWaiting(std::exception_ptr iExcept)
void fillEndPath(ParameterSet &proc_pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration, int bitpos, std::string const &name, std::vector< std::string > const &endPathNames, ConditionalTaskHelper const &conditionalTaskHelper)
void processSwitchEDAliases(ParameterSet const &proc_pset, ProductRegistry &preg, ProcessConfiguration const &processConfiguration, std::unordered_set< std::string > const &allConditionalMods)
void moduleDescriptionsInPath(std::string const &iPathLabel, std::vector< ModuleDescription const *> &descriptions, unsigned int hint) const
TrigResConstPtr results() const
Strings const & getTrigPaths() const
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
def unique(seq, keepstr=True)
StreamContext streamContext_
std::vector< std::string > vstring
virtual std::vector< ConsumesInfo > consumesInfo() const =0
static void fillPathSummary(Path const &path, PathSummary &sum)
void finishedPaths(std::atomic< std::exception_ptr *> &, WaitingTaskHolder, EventTransitionInfo &)
FunctorWaitingTask< F > * make_waiting_task(F f)
bool typeIsViewCompatible(TypeID const &requestedViewType, TypeID const &wrappedtypeID, std::string const &className)
std::exception_ptr finishProcessOneEvent(std::exception_ptr)
ServiceToken lock() const
void deleteModule(std::string const &iLabel)
Delete the module with label iLabel.
static void fillWorkerSummaryAux(Worker const &w, WorkerSummary &sum)
virtual Types moduleType() const =0
Log< level::Info, false > LogInfo
void beginStream(StreamID iID, StreamContext &streamContext)
ModuleDescription const * description() const
std::string const & className() const
void clearCounters()
Clear all the counters in the trigger report.
void fillAliasMap(ParameterSet const &proc_pset, std::unordered_set< std::string > const &allConditionalMods)
Strings const & getEndPaths() const
void getTriggerReport(TriggerReport &rep) const
void addToUnscheduledWorkers(ParameterSet &pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration, std::string label, std::set< std::string > &unscheduledLabels, std::vector< std::string > &shouldBeUsedLabels)
exception_actions::ActionCodes find(const std::string &category) const
std::vector< unsigned int > earlyDeleteHelperToBranchIndicies_
void forAllModuleHolders(F iFunc)
edm::propagate_const< TrigResPtr > results_
bool search_all(ForwardSequence const &s, Datum const &d)
constexpr T & get_underlying(propagate_const< T > &)
void addContext(std::string const &context)
virtual std::unique_ptr< OutputModuleCommunicator > createOutputModuleCommunicator()=0
std::vector< ModuleDescription const * > getAllModuleDescriptions() const
static void fillWorkerSummary(Worker const *pw, WorkerSummary &sum)
std::string const & processName() const
std::atomic< bool > skippingEvent_
void setupResolvers(Principal &principal)
void replaceModule(maker::ModuleHolder *iMod, std::string const &iLabel)
clone the type of module with label iLabel but configure with iPSet.
void fillWorkers(ParameterSet &proc_pset, ProductRegistry &preg, PreallocationConfiguration const *prealloc, std::shared_ptr< ProcessConfiguration const > processConfiguration, std::string const &name, bool ignoreFilters, PathWorkers &out, std::vector< std::string > const &endPathNames, ConditionalTaskHelper const &conditionalTaskHelper)
std::vector< edm::propagate_const< WorkerPtr > > endPathStatusInserterWorkers_
void makePathStatusInserters(std::vector< edm::propagate_const< std::shared_ptr< PathStatusInserter >>> &pathStatusInserters, std::vector< edm::propagate_const< std::shared_ptr< EndPathStatusInserter >>> &endPathStatusInserters, ExceptionToActionTable const &actions)
AllWorkers const & allWorkers() const
returns the collection of pointers to workers
std::unordered_multimap< std::string, edm::BranchDescription const * > conditionalModuleBranches(std::unordered_set< std::string > const &conditionalmods) const
std::vector< ModuleInPathSummary > moduleInPathSummaries
void availablePaths(std::vector< std::string > &oLabelsToFill) const
adds to oLabelsToFill the labels for all paths in the process
unsigned int value() const
auto wrap(F iFunc) -> decltype(iFunc())
std::unordered_multimap< std::string, edm::BranchDescription const * > conditionalModsBranches_
Log< level::Warning, false > LogWarning
std::list< std::string > const & context() const
std::string const & moduleLabel() const
T mod(const T &a, const T &b)
std::string const & name() const
std::vector< std::string > vstring
std::vector< EarlyDeleteHelper > earlyDeleteHelpers_
void addToAllWorkers(Worker *w)
void printCmsExceptionWarning(char const *behavior, cms::Exception const &e)
ParameterSet * getPSetForUpdate(std::string const &name, bool &isTracked)