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);
383 for (
auto const& trig_name : pathNames) {
387 processConfiguration,
392 conditionalTaskHelper);
408 for (
auto const& end_path_name : endPathNames) {
410 proc_pset, preg, &prealloc, processConfiguration, bitpos, end_path_name, endPathNames, conditionalTaskHelper);
417 std::set<std::string> usedWorkerLabels;
419 usedWorkerLabels.insert(worker->description()->moduleLabel());
421 std::vector<std::string> modulesInConfig(proc_pset.
getParameter<std::vector<std::string>>(
"@all_modules"));
422 std::set<std::string> modulesInConfigSet(modulesInConfig.begin(), modulesInConfig.end());
423 std::vector<std::string> unusedLabels;
425 modulesInConfigSet.end(),
426 usedWorkerLabels.begin(),
427 usedWorkerLabels.end(),
428 back_inserter(unusedLabels));
429 std::set<std::string> unscheduledLabels;
430 std::vector<std::string> shouldBeUsedLabels;
431 if (!unusedLabels.empty()) {
436 for (
auto const&
label : unusedLabels) {
440 assert(modulePSet !=
nullptr);
442 *modulePSet, preg, &prealloc, processConfiguration,
label, unscheduledLabels, shouldBeUsedLabels);
444 if (!shouldBeUsedLabels.empty()) {
445 std::ostringstream unusedStream;
446 unusedStream <<
"'" << shouldBeUsedLabels.front() <<
"'";
447 for (std::vector<std::string>::iterator itLabel = shouldBeUsedLabels.begin() + 1,
448 itLabelEnd = shouldBeUsedLabels.end();
449 itLabel != itLabelEnd;
451 unusedStream <<
",'" << *itLabel <<
"'";
453 LogInfo(
"path") <<
"The following module labels are not assigned to any path:\n" << unusedStream.str() <<
"\n";
460 std::vector<std::string>
const& branchesToDeleteEarly,
461 std::multimap<std::string, std::string>
const& referencesToBranches,
462 std::vector<std::string>
const& modulesToSkip,
465 std::multimap<std::string, Worker*> branchToReadingWorker;
466 initializeBranchToReadingWorker(branchesToDeleteEarly, preg, branchToReadingWorker);
468 const std::vector<std::string>
kEmpty;
469 std::map<Worker*, unsigned int> reserveSizeForWorker;
470 unsigned int upperLimitOnReadingWorker = 0;
471 unsigned int upperLimitOnIndicies = 0;
472 unsigned int nUniqueBranchesToDelete = branchToReadingWorker.size();
478 if (!branchToReadingWorker.empty()) {
484 auto found = branchToReadingWorker.equal_range(
desc.branchName());
486 --nUniqueBranchesToDelete;
487 branchToReadingWorker.erase(
found.first,
found.second);
494 if (branchToReadingWorker.empty()) {
498 std::unordered_set<std::string> modulesToExclude(modulesToSkip.begin(), modulesToSkip.end());
500 if (modulesToExclude.end() != modulesToExclude.find(
w->description()->moduleLabel())) {
504 auto consumes =
w->consumesInfo();
505 if (not consumes.empty()) {
506 bool foundAtLeastOneMatchingBranch =
false;
507 for (
auto const& product : consumes) {
509 product.type().friendlyClassName(),
510 product.label().data(),
511 product.instance().data(),
512 product.process().data());
515 auto found = branchToReadingWorker.end();
516 if (product.process().empty()) {
517 auto startFound = branchToReadingWorker.lower_bound(
branch);
518 if (startFound != branchToReadingWorker.end()) {
519 if (startFound->first.substr(0,
branch.size()) ==
branch) {
525 auto exactFound = branchToReadingWorker.equal_range(
branch);
526 if (exactFound.first != exactFound.second) {
527 found = exactFound.first;
530 if (
found != branchToReadingWorker.end()) {
531 if (not foundAtLeastOneMatchingBranch) {
532 ++upperLimitOnReadingWorker;
533 foundAtLeastOneMatchingBranch =
true;
535 ++upperLimitOnIndicies;
536 ++reserveSizeForWorker[
w];
537 if (
nullptr ==
found->second) {
540 branchToReadingWorker.insert(make_pair(
found->first,
w));
546 auto found = referencesToBranches.end();
547 if (product.process().empty()) {
548 auto startFound = referencesToBranches.lower_bound(
branch);
549 if (startFound != referencesToBranches.end()) {
550 if (startFound->first.substr(0,
branch.size()) ==
branch) {
557 auto exactFound = referencesToBranches.equal_range(
branch);
558 if (exactFound.first != exactFound.second) {
559 found = exactFound.first;
562 if (
found != referencesToBranches.end()) {
563 for (
auto itr =
found; (itr != referencesToBranches.end()) and (itr->first ==
found->first); ++itr) {
564 auto foundInBranchToReadingWorker = branchToReadingWorker.find(itr->second);
565 if (foundInBranchToReadingWorker == branchToReadingWorker.end()) {
568 if (not foundAtLeastOneMatchingBranch) {
569 ++upperLimitOnReadingWorker;
570 foundAtLeastOneMatchingBranch =
true;
572 ++upperLimitOnIndicies;
573 ++reserveSizeForWorker[
w];
574 if (
nullptr == foundInBranchToReadingWorker->second) {
575 foundInBranchToReadingWorker->second =
w;
577 branchToReadingWorker.insert(make_pair(itr->second,
w));
586 auto it = branchToReadingWorker.begin();
587 std::vector<std::string> unusedBranches;
588 while (it != branchToReadingWorker.end()) {
589 if (it->second ==
nullptr) {
590 unusedBranches.push_back(it->first);
594 branchToReadingWorker.erase(
temp);
599 if (not unusedBranches.empty()) {
601 l <<
"The following products in the 'canDeleteEarly' list are not used in this job and will be ignored.\n" 602 " If possible, remove the producer from the job.";
603 for (
auto const&
n : unusedBranches) {
608 if (!branchToReadingWorker.empty()) {
612 std::map<const Worker*, EarlyDeleteHelper*> alreadySeenWorkers;
614 size_t nextOpenIndex = 0;
616 for (
auto& branchAndWorker : branchToReadingWorker) {
617 if (lastBranchName != branchAndWorker.first) {
619 BranchID bid(branchAndWorker.first +
".");
621 lastBranchName = branchAndWorker.first;
623 auto found = alreadySeenWorkers.find(branchAndWorker.second);
624 if (alreadySeenWorkers.end() ==
found) {
629 size_t index = nextOpenIndex;
630 size_t nIndices = reserveSizeForWorker[branchAndWorker.second];
635 alreadySeenWorkers.insert(std::make_pair(branchAndWorker.second, &(
earlyDeleteHelpers_.back())));
636 nextOpenIndex += nIndices;
646 if (itLast->end() != it->begin()) {
648 unsigned int delta = it->begin() - itLast->end();
649 it->shiftIndexPointers(
delta);
663 p.setEarlyDeleteHelpers(alreadySeenWorkers);
666 p.setEarlyDeleteHelpers(alreadySeenWorkers);
674 std::unordered_set<std::string>& conditionalModules,
675 std::unordered_multimap<std::string, edm::BranchDescription const*>
const& conditionalModuleBranches,
676 std::unordered_multimap<std::string, AliasInfo>
const& aliasMap,
680 std::shared_ptr<ProcessConfiguration const> processConfiguration) {
681 std::vector<Worker*> returnValue;
684 using namespace productholderindexhelper;
685 for (
auto const& ci : consumesInfo) {
686 if (not ci.skipCurrentProcess() and
687 (ci.process().empty()
or ci.process() == processConfiguration->processName())) {
689 bool productFromConditionalModule =
false;
690 auto itFound = conditionalModules.find(productModuleLabel);
691 if (itFound == conditionalModules.end()) {
694 auto foundAlias = findBestMatchingAlias(conditionalModuleBranches, aliasMap, productModuleLabel, ci);
696 productModuleLabel = *foundAlias;
697 productFromConditionalModule =
true;
698 itFound = conditionalModules.find(productModuleLabel);
700 if (itFound == conditionalModules.end()) {
706 auto findBranches = conditionalModuleBranches.equal_range(productModuleLabel);
707 for (
auto itBranch = findBranches.first; itBranch != findBranches.second; ++itBranch) {
708 if (itBranch->second->productInstanceName() == ci.instance()) {
710 if (ci.type() == itBranch->second->unwrappedTypeID()) {
711 productFromConditionalModule =
true;
717 ci.type(),
TypeID(itBranch->second->wrappedType().typeInfo()), itBranch->second->
className())) {
718 productFromConditionalModule =
true;
725 if (productFromConditionalModule) {
727 getWorker(productModuleLabel, proc_pset,
workerManager_, preg, prealloc, processConfiguration);
730 conditionalModules.erase(itFound);
734 conditionalModuleBranches,
739 processConfiguration);
740 returnValue.insert(returnValue.end(), dependents.begin(), dependents.end());
741 returnValue.push_back(condWorker);
751 std::shared_ptr<ProcessConfiguration const> processConfiguration,
755 std::vector<std::string>
const& endPathNames,
761 auto condRange = findConditionalTaskModulesRange(modnames);
763 std::unordered_set<std::string> conditionalmods;
765 std::unordered_multimap<std::string, edm::BranchDescription const*> conditionalModsBranches;
766 std::unordered_map<std::string, unsigned int> conditionalModOrder;
767 if (condRange.first != condRange.second) {
768 for (
auto it = condRange.first; it != condRange.second; ++it) {
770 conditionalModOrder.emplace(*it, it - modnames.begin() - 1);
773 conditionalmods = std::unordered_set<std::string>(std::make_move_iterator(condRange.first),
774 std::make_move_iterator(condRange.second));
777 modnames.erase(std::prev(condRange.first), modnames.end());
780 unsigned int placeInPath = 0;
781 for (
auto const&
name : modnames) {
783 bool doNotRunConcurrently =
false;
785 if (
name[0] ==
'!') {
787 }
else if (
name[0] ==
'-' or name[0] ==
'+') {
792 doNotRunConcurrently =
true;
801 if (worker ==
nullptr) {
807 <<
"The unknown module label \"" <<
moduleLabel <<
"\" appears in " << pathType <<
" \"" <<
pathName 808 <<
"\"\n please check spelling or remove that label from the path.";
819 <<
"' with module label '" <<
moduleLabel <<
"' appears on EndPath '" 821 <<
"The return value of the filter will be ignored.\n" 822 <<
"To suppress this warning, either remove the filter from the endpath,\n" 823 <<
"or explicitly ignore it in the configuration by using cms.ignore().\n";
826 bool runConcurrently = not doNotRunConcurrently;
828 runConcurrently =
false;
833 conditionalModsBranches,
838 processConfiguration);
839 for (
auto condMod : condModules) {
840 tmpworkers.emplace_back(
841 condMod,
WorkerInPath::Ignore, conditionalModOrder[condMod->description()->moduleLabel()],
true);
844 tmpworkers.emplace_back(worker, filterAction, placeInPath, runConcurrently);
848 out.swap(tmpworkers);
854 std::shared_ptr<ProcessConfiguration const> processConfiguration,
858 std::vector<std::string>
const& endPathNames,
862 proc_pset, preg, prealloc, processConfiguration,
name,
false, tmpworkers, endPathNames, conditionalTaskHelper);
865 if (!tmpworkers.empty()) {
879 std::shared_ptr<ProcessConfiguration const> processConfiguration,
882 std::vector<std::string>
const& endPathNames,
886 proc_pset, preg, prealloc, processConfiguration,
name,
true, tmpworkers, endPathNames, conditionalTaskHelper);
888 if (!tmpworkers.empty()) {
912 if (worker->description()->moduleLabel() == iLabel) {
917 if (
nullptr ==
found) {
928 std::vector<ModuleDescription const*>
result;
964 results_->at(empty_trig_path) = hltPathStatus;
965 pathStatusInserters[empty_trig_path]->setPathStatus(
streamID_, hltPathStatus);
987 auto pathErrorHolder = std::make_unique<std::atomic<std::exception_ptr*>>(
nullptr);
988 auto pathErrorPtr = pathErrorHolder.get();
991 [iTask,
this, weakToken, pathError =
std::move(pathErrorHolder)](std::exception_ptr
const* iPtr)
mutable {
994 std::exception_ptr ptr;
995 if (pathError->load()) {
996 ptr = *pathError->load();
997 delete pathError->load();
999 if ((not ptr) and iPtr) {
1009 auto pathsDone =
make_waiting_task([allPathsHolder, pathErrorPtr, transitionInfo =
info,
this, weakToken](
1010 std::exception_ptr
const* iPtr)
mutable {
1016 pathErrorPtr->store(
new std::exception_ptr(*iPtr));
1054 *(iExcept.load()) = std::exception_ptr();
1056 *(iExcept.load()) = std::current_exception();
1059 *(iExcept.load()) = std::current_exception();
1063 if ((not iExcept) and
results_->accept()) {
1077 std::rethrow_exception(expt);
1082 std::ostringstream ost;
1083 ost <<
"Processing Event " <<
info.principal().id();
1086 iExcept.store(
new std::exception_ptr(std::current_exception()));
1090 iExcept.store(
new std::exception_ptr(std::current_exception()));
1094 std::exception_ptr ptr;
1096 ptr = *iExcept.load();
1109 bool const cleaningUpAfterException =
false;
1115 iExcept = std::current_exception();
1123 iExcept = std::current_exception();
1137 std::back_inserter(oLabelsToFill),
1138 std::bind(&
Path::name, std::placeholders::_1));
1142 TrigPaths::const_iterator itFound = std::find_if(
1145 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1147 oLabelsToFill.reserve(itFound->size());
1148 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1149 oLabelsToFill.push_back(itFound->getWorker(
i)->description()->moduleLabel());
1155 std::vector<ModuleDescription const*>& descriptions,
1156 unsigned int hint)
const {
1157 descriptions.clear();
1159 TrigPaths::const_iterator itFound;
1163 if (itFound->name() == iPathLabel)
1168 itFound = std::find_if(
1171 std::bind(std::equal_to<std::string>(), iPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1176 descriptions.reserve(itFound->size());
1177 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1178 descriptions.push_back(itFound->getWorker(
i)->description());
1184 std::vector<ModuleDescription const*>& descriptions,
1185 unsigned int hint)
const {
1186 descriptions.clear();
1188 TrigPaths::const_iterator itFound;
1192 if (itFound->name() == iEndPathLabel)
1197 itFound = std::find_if(
1200 std::bind(std::equal_to<std::string>(), iEndPathLabel, std::bind(&
Path::name, std::placeholders::_1)));
1205 descriptions.reserve(itFound->size());
1206 for (
size_t i = 0;
i < itFound->size(); ++
i) {
1207 descriptions.push_back(itFound->getWorker(
i)->description());
1231 std::vector<ModuleInPathSummary>
temp(sz);
1232 for (
size_t i = 0;
i != sz; ++
i) {
1238 for (
size_t i = 0;
i != sz; ++
i) {
1266 using std::placeholders::_1;
1296 unsigned int indexEmpty = 0;
1297 unsigned int indexOfPath = 0;
1298 for (
auto& pathStatusInserter : pathStatusInserters) {
1299 std::shared_ptr<PathStatusInserter> inserterPtr =
get_underlying(pathStatusInserter);
1303 workerPtr->setActivityRegistry(
actReg_);
1312 trig_paths_.at(indexOfPath).setPathStatusInserter(inserterPtr.get(), workerPtr.get());
1321 for (
auto& endPathStatusInserter : endPathStatusInserters) {
1322 std::shared_ptr<EndPathStatusInserter> inserterPtr =
get_underlying(endPathStatusInserter);
1326 workerPtr->setActivityRegistry(
actReg_);
1335 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
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)