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 if (productModuleLabel.empty()) {
692 for (
auto const&
branch : conditionalModuleBranches) {
694 if (conditionalModules.find(
branch.first) == conditionalModules.end()) {
698 if (
branch.second->unwrappedTypeID() != ci.type()) {
703 ci.type(),
TypeID(
branch.second->wrappedType().typeInfo()),
branch.second->className())) {
708 auto condWorker = getWorker(
branch.first, proc_pset,
workerManager_, preg, prealloc, processConfiguration);
711 conditionalModules.erase(
branch.first);
715 conditionalModuleBranches,
720 processConfiguration);
721 returnValue.insert(returnValue.end(), dependents.begin(), dependents.end());
722 returnValue.push_back(condWorker);
726 bool productFromConditionalModule =
false;
727 auto itFound = conditionalModules.find(productModuleLabel);
728 if (itFound == conditionalModules.end()) {
731 auto foundAlias = findBestMatchingAlias(conditionalModuleBranches, aliasMap, productModuleLabel, ci);
733 productModuleLabel = *foundAlias;
734 productFromConditionalModule =
true;
735 itFound = conditionalModules.find(productModuleLabel);
737 if (itFound == conditionalModules.end()) {
743 auto findBranches = conditionalModuleBranches.equal_range(productModuleLabel);
744 for (
auto itBranch = findBranches.first; itBranch != findBranches.second; ++itBranch) {
745 if (itBranch->second->productInstanceName() == ci.instance()) {
747 if (ci.type() == itBranch->second->unwrappedTypeID()) {
748 productFromConditionalModule =
true;
754 TypeID(itBranch->second->wrappedType().typeInfo()),
756 productFromConditionalModule =
true;
763 if (productFromConditionalModule) {
765 getWorker(productModuleLabel, proc_pset,
workerManager_, preg, prealloc, processConfiguration);
768 conditionalModules.erase(itFound);
772 conditionalModuleBranches,
777 processConfiguration);
778 returnValue.insert(returnValue.end(), dependents.begin(), dependents.end());
779 returnValue.push_back(condWorker);
790 std::shared_ptr<ProcessConfiguration const> processConfiguration,
794 std::vector<std::string>
const& endPathNames,
800 auto condRange = findConditionalTaskModulesRange(modnames);
802 std::unordered_set<std::string> conditionalmods;
804 std::unordered_multimap<std::string, edm::BranchDescription const*> conditionalModsBranches;
805 std::unordered_map<std::string, unsigned int> conditionalModOrder;
806 if (condRange.first != condRange.second) {
807 for (
auto it = condRange.first; it != condRange.second; ++it) {
809 conditionalModOrder.emplace(*it, it - modnames.begin() - 1);
812 conditionalmods = std::unordered_set<std::string>(std::make_move_iterator(condRange.first),
813 std::make_move_iterator(condRange.second));
816 modnames.erase(std::prev(condRange.first), modnames.end());
819 unsigned int placeInPath = 0;
820 for (
auto const&
name : modnames) {
822 bool doNotRunConcurrently =
false;
824 if (
name[0] ==
'!') {
826 }
else if (
name[0] ==
'-' or name[0] ==
'+') {
831 doNotRunConcurrently =
true;
840 if (worker ==
nullptr) {
846 <<
"The unknown module label \"" <<
moduleLabel <<
"\" appears in " << pathType <<
" \"" <<
pathName 847 <<
"\"\n please check spelling or remove that label from the path.";
858 <<
"' with module label '" <<
moduleLabel <<
"' appears on EndPath '" 860 <<
"The return value of the filter will be ignored.\n" 861 <<
"To suppress this warning, either remove the filter from the endpath,\n" 862 <<
"or explicitly ignore it in the configuration by using cms.ignore().\n";
865 bool runConcurrently = not doNotRunConcurrently;
867 runConcurrently =
false;
872 conditionalModsBranches,
877 processConfiguration);
878 for (
auto condMod : condModules) {
879 tmpworkers.emplace_back(
880 condMod,
WorkerInPath::Ignore, conditionalModOrder[condMod->description()->moduleLabel()],
true);
883 tmpworkers.emplace_back(worker, filterAction, placeInPath, runConcurrently);
887 out.swap(tmpworkers);
893 std::shared_ptr<ProcessConfiguration const> processConfiguration,
897 std::vector<std::string>
const& endPathNames,
901 proc_pset, preg, prealloc, processConfiguration,
name,
false, tmpworkers, endPathNames, conditionalTaskHelper);
904 if (!tmpworkers.empty()) {
925 std::shared_ptr<ProcessConfiguration const> processConfiguration,
928 std::vector<std::string>
const& endPathNames,
932 proc_pset, preg, prealloc, processConfiguration,
name,
true, tmpworkers, endPathNames, conditionalTaskHelper);
934 if (!tmpworkers.empty()) {
960 if (worker->description()->moduleLabel() == iLabel) {
965 if (
nullptr ==
found) {
976 std::vector<ModuleDescription const*>
result;
1012 results_->at(empty_trig_path) = hltPathStatus;
1013 pathStatusInserters[empty_trig_path]->setPathStatus(
streamID_, hltPathStatus);
1035 auto pathErrorHolder = std::make_unique<std::atomic<std::exception_ptr*>>(
nullptr);
1036 auto pathErrorPtr = pathErrorHolder.get();
1039 [iTask,
this, weakToken, pathError =
std::move(pathErrorHolder)](std::exception_ptr
const* iPtr)
mutable {
1042 std::exception_ptr ptr;
1043 if (pathError->load()) {
1044 ptr = *pathError->load();
1045 delete pathError->load();
1047 if ((not ptr) and iPtr) {
1057 auto pathsDone =
make_waiting_task([allPathsHolder, pathErrorPtr, transitionInfo =
info,
this, weakToken](
1058 std::exception_ptr
const* iPtr)
mutable {
1064 pathErrorPtr->store(
new std::exception_ptr(*iPtr));
1103 *(iExcept.load()) = std::exception_ptr();
1105 *(iExcept.load()) = std::current_exception();
1108 *(iExcept.load()) = std::current_exception();
1112 if ((not iExcept) and
results_->accept()) {
1126 std::rethrow_exception(expt);
1131 std::ostringstream ost;
1132 ost <<
"Processing Event " <<
info.principal().id();
1135 iExcept.store(
new std::exception_ptr(std::current_exception()));
1139 iExcept.store(
new std::exception_ptr(std::current_exception()));
1143 std::exception_ptr ptr;
1145 ptr = *iExcept.load();
1158 bool const cleaningUpAfterException =
false;
1164 iExcept = std::current_exception();
1172 iExcept = std::current_exception();
1186 std::back_inserter(oLabelsToFill),
1187 std::bind(&
Path::name, std::placeholders::_1));
1191 TrigPaths::const_iterator itFound = std::find_if(
1194 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1196 oLabelsToFill.reserve(itFound->size());
1197 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1198 oLabelsToFill.push_back(itFound->getWorker(
i)->description()->moduleLabel());
1204 std::vector<ModuleDescription const*>& descriptions,
1205 unsigned int hint)
const {
1206 descriptions.clear();
1208 TrigPaths::const_iterator itFound;
1212 if (itFound->name() == iPathLabel)
1217 itFound = std::find_if(
1220 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1225 descriptions.reserve(itFound->size());
1226 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1227 descriptions.push_back(itFound->getWorker(
i)->description());
1233 std::vector<ModuleDescription const*>& descriptions,
1234 unsigned int hint)
const {
1235 descriptions.clear();
1237 TrigPaths::const_iterator itFound;
1241 if (itFound->name() == iEndPathLabel)
1246 itFound = std::find_if(
1249 std::bind(std::equal_to<std::string>(), iEndPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1254 descriptions.reserve(itFound->size());
1255 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1256 descriptions.push_back(itFound->getWorker(
i)->description());
1280 std::vector<ModuleInPathSummary>
temp(sz);
1281 for (
size_t i = 0;
i != sz; ++
i) {
1287 for (
size_t i = 0;
i != sz; ++
i) {
1315 using std::placeholders::_1;
1348 unsigned int indexEmpty = 0;
1349 unsigned int indexOfPath = 0;
1350 for (
auto& pathStatusInserter : pathStatusInserters) {
1351 std::shared_ptr<PathStatusInserter> inserterPtr =
get_underlying(pathStatusInserter);
1355 workerPtr->setActivityRegistry(
actReg_);
1364 trig_paths_.at(indexOfPath).setPathStatusInserter(inserterPtr.get(), workerPtr.get());
1373 for (
auto& endPathStatusInserter : endPathStatusInserters) {
1374 std::shared_ptr<EndPathStatusInserter> inserterPtr =
get_underlying(endPathStatusInserter);
1378 workerPtr->setActivityRegistry(
actReg_);
1387 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)