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 bool hasPath =
false;
375 std::vector<std::string>
const& pathNames = tns.
getTrigPaths();
376 std::vector<std::string>
const& endPathNames = tns.
getEndPaths();
379 proc_pset, preg, &prealloc, processConfiguration,
workerManager_, pathNames);
380 std::unordered_set<std::string> conditionalModules;
384 for (
auto const& trig_name : pathNames) {
388 processConfiguration,
393 conditionalTaskHelper,
410 for (
auto const& end_path_name : endPathNames) {
414 processConfiguration,
418 conditionalTaskHelper,
426 std::set<std::string> usedWorkerLabels;
428 usedWorkerLabels.insert(worker->description()->moduleLabel());
430 std::vector<std::string> modulesInConfig(proc_pset.
getParameter<std::vector<std::string>>(
"@all_modules"));
431 std::set<std::string> modulesInConfigSet(modulesInConfig.begin(), modulesInConfig.end());
432 std::vector<std::string> unusedLabels;
434 modulesInConfigSet.end(),
435 usedWorkerLabels.begin(),
436 usedWorkerLabels.end(),
437 back_inserter(unusedLabels));
438 std::set<std::string> unscheduledLabels;
439 std::vector<std::string> shouldBeUsedLabels;
440 if (!unusedLabels.empty()) {
445 for (
auto const&
label : unusedLabels) {
449 assert(modulePSet !=
nullptr);
451 *modulePSet, preg, &prealloc, processConfiguration,
label, unscheduledLabels, shouldBeUsedLabels);
453 if (!shouldBeUsedLabels.empty()) {
454 std::ostringstream unusedStream;
455 unusedStream <<
"'" << shouldBeUsedLabels.front() <<
"'";
456 for (std::vector<std::string>::iterator itLabel = shouldBeUsedLabels.begin() + 1,
457 itLabelEnd = shouldBeUsedLabels.end();
458 itLabel != itLabelEnd;
460 unusedStream <<
",'" << *itLabel <<
"'";
462 LogInfo(
"path") <<
"The following module labels are not assigned to any path:\n" << unusedStream.str() <<
"\n";
468 if (
streamID.
value() == 0 and not conditionalModules.empty()) {
473 std::vector<std::string_view> labelsToPrint;
475 unscheduledLabels.begin(),
476 unscheduledLabels.end(),
477 std::back_inserter(labelsToPrint),
478 [&conditionalModules](
auto const& lab) {
return conditionalModules.find(lab) != conditionalModules.end(); });
480 if (not labelsToPrint.empty()) {
482 log <<
"The following modules were part of some ConditionalTask, but were not\n" 483 <<
"consumed by any other module in any of the Paths to which the ConditionalTask\n" 484 <<
"was associated. Perhaps they should be either removed from the\n" 485 <<
"job, or moved to a Task to make it explicit they are unscheduled.\n";
486 for (
auto const& modLabel : labelsToPrint) {
487 log.format(
"\n {}", modLabel);
494 std::vector<std::string>
const& branchesToDeleteEarly,
495 std::multimap<std::string, std::string>
const& referencesToBranches,
496 std::vector<std::string>
const& modulesToSkip,
499 std::multimap<std::string, Worker*> branchToReadingWorker;
500 initializeBranchToReadingWorker(branchesToDeleteEarly, preg, branchToReadingWorker);
502 const std::vector<std::string>
kEmpty;
503 std::map<Worker*, unsigned int> reserveSizeForWorker;
504 unsigned int upperLimitOnReadingWorker = 0;
505 unsigned int upperLimitOnIndicies = 0;
506 unsigned int nUniqueBranchesToDelete = branchToReadingWorker.size();
512 if (!branchToReadingWorker.empty()) {
518 auto found = branchToReadingWorker.equal_range(
desc.branchName());
520 --nUniqueBranchesToDelete;
521 branchToReadingWorker.erase(
found.first,
found.second);
528 if (branchToReadingWorker.empty()) {
532 std::unordered_set<std::string> modulesToExclude(modulesToSkip.begin(), modulesToSkip.end());
534 if (modulesToExclude.end() != modulesToExclude.find(
w->description()->moduleLabel())) {
538 auto consumes =
w->consumesInfo();
539 if (not consumes.empty()) {
540 bool foundAtLeastOneMatchingBranch =
false;
541 for (
auto const& product : consumes) {
543 product.type().friendlyClassName(),
544 product.label().data(),
545 product.instance().data(),
546 product.process().data());
549 auto found = branchToReadingWorker.end();
550 if (product.process().empty()) {
551 auto startFound = branchToReadingWorker.lower_bound(
branch);
552 if (startFound != branchToReadingWorker.end()) {
553 if (startFound->first.substr(0,
branch.size()) ==
branch) {
559 auto exactFound = branchToReadingWorker.equal_range(
branch);
560 if (exactFound.first != exactFound.second) {
561 found = exactFound.first;
564 if (
found != branchToReadingWorker.end()) {
565 if (not foundAtLeastOneMatchingBranch) {
566 ++upperLimitOnReadingWorker;
567 foundAtLeastOneMatchingBranch =
true;
569 ++upperLimitOnIndicies;
570 ++reserveSizeForWorker[
w];
571 if (
nullptr ==
found->second) {
574 branchToReadingWorker.insert(make_pair(
found->first,
w));
580 auto found = referencesToBranches.end();
581 if (product.process().empty()) {
582 auto startFound = referencesToBranches.lower_bound(
branch);
583 if (startFound != referencesToBranches.end()) {
584 if (startFound->first.substr(0,
branch.size()) ==
branch) {
591 auto exactFound = referencesToBranches.equal_range(
branch);
592 if (exactFound.first != exactFound.second) {
593 found = exactFound.first;
596 if (
found != referencesToBranches.end()) {
597 for (
auto itr =
found; (itr != referencesToBranches.end()) and (itr->first ==
found->first); ++itr) {
598 auto foundInBranchToReadingWorker = branchToReadingWorker.find(itr->second);
599 if (foundInBranchToReadingWorker == branchToReadingWorker.end()) {
602 if (not foundAtLeastOneMatchingBranch) {
603 ++upperLimitOnReadingWorker;
604 foundAtLeastOneMatchingBranch =
true;
606 ++upperLimitOnIndicies;
607 ++reserveSizeForWorker[
w];
608 if (
nullptr == foundInBranchToReadingWorker->second) {
609 foundInBranchToReadingWorker->second =
w;
611 branchToReadingWorker.insert(make_pair(itr->second,
w));
620 auto it = branchToReadingWorker.begin();
621 std::vector<std::string> unusedBranches;
622 while (
it != branchToReadingWorker.end()) {
623 if (
it->second ==
nullptr) {
624 unusedBranches.push_back(
it->first);
628 branchToReadingWorker.erase(
temp);
633 if (not unusedBranches.empty()) {
635 l <<
"The following products in the 'canDeleteEarly' list are not used in this job and will be ignored.\n" 636 " If possible, remove the producer from the job.";
637 for (
auto const&
n : unusedBranches) {
642 if (!branchToReadingWorker.empty()) {
646 std::map<const Worker*, EarlyDeleteHelper*> alreadySeenWorkers;
648 size_t nextOpenIndex = 0;
650 for (
auto& branchAndWorker : branchToReadingWorker) {
651 if (lastBranchName != branchAndWorker.first) {
653 BranchID bid(branchAndWorker.first +
".");
655 lastBranchName = branchAndWorker.first;
657 auto found = alreadySeenWorkers.find(branchAndWorker.second);
658 if (alreadySeenWorkers.end() ==
found) {
663 size_t index = nextOpenIndex;
664 size_t nIndices = reserveSizeForWorker[branchAndWorker.second];
669 alreadySeenWorkers.insert(std::make_pair(branchAndWorker.second, &(
earlyDeleteHelpers_.back())));
670 nextOpenIndex += nIndices;
680 if (itLast->end() !=
it->begin()) {
682 unsigned int delta =
it->begin() - itLast->end();
697 p.setEarlyDeleteHelpers(alreadySeenWorkers);
700 p.setEarlyDeleteHelpers(alreadySeenWorkers);
708 std::unordered_set<std::string>& conditionalModules,
709 std::unordered_multimap<std::string, edm::BranchDescription const*>
const& conditionalModuleBranches,
710 std::unordered_multimap<std::string, AliasInfo>
const& aliasMap,
714 std::shared_ptr<ProcessConfiguration const> processConfiguration) {
715 std::vector<Worker*> returnValue;
718 using namespace productholderindexhelper;
719 for (
auto const& ci : consumesInfo) {
720 if (not ci.skipCurrentProcess() and
721 (ci.process().empty()
or ci.process() == processConfiguration->processName())) {
723 bool productFromConditionalModule =
false;
724 auto itFound = conditionalModules.find(productModuleLabel);
725 if (itFound == conditionalModules.end()) {
728 auto foundAlias = findBestMatchingAlias(conditionalModuleBranches, aliasMap, productModuleLabel, ci);
730 productModuleLabel = *foundAlias;
731 productFromConditionalModule =
true;
732 itFound = conditionalModules.find(productModuleLabel);
734 if (itFound == conditionalModules.end()) {
740 auto findBranches = conditionalModuleBranches.equal_range(productModuleLabel);
741 for (
auto itBranch = findBranches.first; itBranch != findBranches.second; ++itBranch) {
742 if (itBranch->second->productInstanceName() == ci.instance()) {
744 if (ci.type() == itBranch->second->unwrappedTypeID()) {
745 productFromConditionalModule =
true;
751 ci.type(),
TypeID(itBranch->second->wrappedType().typeInfo()), itBranch->second->
className())) {
752 productFromConditionalModule =
true;
759 if (productFromConditionalModule) {
761 getWorker(productModuleLabel, proc_pset,
workerManager_, preg, prealloc, processConfiguration);
764 conditionalModules.erase(itFound);
768 conditionalModuleBranches,
773 processConfiguration);
774 returnValue.insert(returnValue.end(), dependents.begin(), dependents.end());
775 returnValue.push_back(condWorker);
785 std::shared_ptr<ProcessConfiguration const> processConfiguration,
789 std::vector<std::string>
const& endPathNames,
791 std::unordered_set<std::string>& allConditionalModules) {
796 auto condRange = findConditionalTaskModulesRange(modnames);
798 std::unordered_set<std::string> conditionalmods;
800 std::unordered_multimap<std::string, edm::BranchDescription const*> conditionalModsBranches;
801 std::unordered_map<std::string, unsigned int> conditionalModOrder;
802 if (condRange.first != condRange.second) {
803 for (
auto it = condRange.first;
it != condRange.second; ++
it) {
805 conditionalModOrder.emplace(*
it,
it - modnames.begin() - 1);
808 conditionalmods = std::unordered_set<std::string>(std::make_move_iterator(condRange.first),
809 std::make_move_iterator(condRange.second));
812 modnames.erase(std::prev(condRange.first), modnames.end());
815 allConditionalModules.insert(conditionalmods.begin(), conditionalmods.end());
818 unsigned int placeInPath = 0;
819 for (
auto const&
name : modnames) {
821 bool doNotRunConcurrently =
false;
823 if (
name[0] ==
'!') {
825 }
else if (
name[0] ==
'-' or name[0] ==
'+') {
830 doNotRunConcurrently =
true;
839 if (worker ==
nullptr) {
845 <<
"The unknown module label \"" <<
moduleLabel <<
"\" appears in " << pathType <<
" \"" <<
pathName 846 <<
"\"\n please check spelling or remove that label from the path.";
857 <<
"' with module label '" <<
moduleLabel <<
"' appears on EndPath '" 859 <<
"The return value of the filter will be ignored.\n" 860 <<
"To suppress this warning, either remove the filter from the endpath,\n" 861 <<
"or explicitly ignore it in the configuration by using cms.ignore().\n";
864 bool runConcurrently = not doNotRunConcurrently;
866 runConcurrently =
false;
871 conditionalModsBranches,
876 processConfiguration);
877 for (
auto condMod : condModules) {
878 tmpworkers.emplace_back(
879 condMod,
WorkerInPath::Ignore, conditionalModOrder[condMod->description()->moduleLabel()],
true);
882 tmpworkers.emplace_back(worker, filterAction, placeInPath, runConcurrently);
886 out.swap(tmpworkers);
892 std::shared_ptr<ProcessConfiguration const> processConfiguration,
896 std::vector<std::string>
const& endPathNames,
898 std::unordered_set<std::string>& allConditionalModules) {
903 processConfiguration,
908 conditionalTaskHelper,
909 allConditionalModules);
912 if (!tmpworkers.empty()) {
926 std::shared_ptr<ProcessConfiguration const> processConfiguration,
929 std::vector<std::string>
const& endPathNames,
931 std::unordered_set<std::string>& allConditionalModules) {
936 processConfiguration,
941 conditionalTaskHelper,
942 allConditionalModules);
944 if (!tmpworkers.empty()) {
968 if (worker->description()->moduleLabel() == iLabel) {
973 if (
nullptr ==
found) {
984 std::vector<ModuleDescription const*>
result;
1020 results_->at(empty_trig_path) = hltPathStatus;
1021 pathStatusInserters[empty_trig_path]->setPathStatus(
streamID_, hltPathStatus);
1032 std::exception_ptr except =
1046 auto pathErrorHolder = std::make_unique<std::atomic<std::exception_ptr*>>(
nullptr);
1047 auto pathErrorPtr = pathErrorHolder.get();
1050 [iTask,
this, weakToken, pathError =
std::move(pathErrorHolder)](std::exception_ptr
const* iPtr)
mutable {
1053 std::exception_ptr ptr;
1054 if (pathError->load()) {
1055 ptr = *pathError->load();
1056 delete pathError->load();
1058 if ((not ptr) and iPtr) {
1068 auto pathsDone =
make_waiting_task([allPathsHolder, pathErrorPtr, transitionInfo =
info,
this, weakToken](
1069 std::exception_ptr
const* iPtr)
mutable {
1075 pathErrorPtr->store(
new std::exception_ptr(*iPtr));
1113 *(iExcept.load()) = std::exception_ptr();
1115 *(iExcept.load()) = std::current_exception();
1118 *(iExcept.load()) = std::current_exception();
1122 if ((not iExcept) and
results_->accept()) {
1136 std::rethrow_exception(expt);
1141 std::ostringstream ost;
1142 ost <<
"Processing Event " <<
info.principal().id();
1145 iExcept.store(
new std::exception_ptr(std::current_exception()));
1149 iExcept.store(
new std::exception_ptr(std::current_exception()));
1153 std::exception_ptr ptr;
1155 ptr = *iExcept.load();
1168 bool const cleaningUpAfterException =
false;
1174 iExcept = std::current_exception();
1182 iExcept = std::current_exception();
1196 std::back_inserter(oLabelsToFill),
1197 std::bind(&
Path::name, std::placeholders::_1));
1201 TrigPaths::const_iterator itFound = std::find_if(
1204 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1206 oLabelsToFill.reserve(itFound->size());
1207 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1208 oLabelsToFill.push_back(itFound->getWorker(
i)->description()->moduleLabel());
1214 std::vector<ModuleDescription const*>& descriptions,
1215 unsigned int hint)
const {
1216 descriptions.clear();
1218 TrigPaths::const_iterator itFound;
1222 if (itFound->name() == iPathLabel)
1227 itFound = std::find_if(
1230 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1235 descriptions.reserve(itFound->size());
1236 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1237 descriptions.push_back(itFound->getWorker(
i)->description());
1243 std::vector<ModuleDescription const*>& descriptions,
1244 unsigned int hint)
const {
1245 descriptions.clear();
1247 TrigPaths::const_iterator itFound;
1251 if (itFound->name() == iEndPathLabel)
1256 itFound = std::find_if(
1259 std::bind(std::equal_to<std::string>(), iEndPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1264 descriptions.reserve(itFound->size());
1265 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1266 descriptions.push_back(itFound->getWorker(
i)->description());
1290 std::vector<ModuleInPathSummary>
temp(sz);
1291 for (
size_t i = 0;
i != sz; ++
i) {
1297 for (
size_t i = 0;
i != sz; ++
i) {
1325 using std::placeholders::_1;
1355 unsigned int indexEmpty = 0;
1356 unsigned int indexOfPath = 0;
1357 for (
auto& pathStatusInserter : pathStatusInserters) {
1358 std::shared_ptr<PathStatusInserter> inserterPtr =
get_underlying(pathStatusInserter);
1362 workerPtr->setActivityRegistry(
actReg_);
1371 trig_paths_.at(indexOfPath).setPathStatusInserter(inserterPtr.get(), workerPtr.get());
1380 for (
auto& endPathStatusInserter : endPathStatusInserters) {
1381 std::shared_ptr<EndPathStatusInserter> inserterPtr =
get_underlying(endPathStatusInserter);
1385 workerPtr->setActivityRegistry(
actReg_);
1394 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
std::vector< int > empty_trig_paths_
roAction_t actions[nactions]
std::vector< edm::propagate_const< WorkerPtr > > pathStatusInserterWorkers_
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::unordered_set< std::string > &allConditionalModules)
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 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)
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::unordered_set< std::string > &allConditionalModules)
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
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.
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
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, std::unordered_set< std::string > &allConditionalModules)
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)