Public Member Functions | Private Member Functions | List of all members
art::ProcessingOptionsHandler Class Reference

#include <ProcessingOptionsHandler.h>

Inheritance diagram for art::ProcessingOptionsHandler:
art::OptionsHandler

Public Member Functions

 ProcessingOptionsHandler (bpo::options_description &desc)
 
- Public Member Functions inherited from art::OptionsHandler
virtual ~OptionsHandler ()=default
 
int checkOptions (bpo::variables_map const &vm)
 
int processOptions (bpo::variables_map const &vm, fhicl::intermediate_table &raw_config)
 

Private Member Functions

int doCheckOptions (bpo::variables_map const &vm) override
 
int doProcessOptions (bpo::variables_map const &vm, fhicl::intermediate_table &raw_config) override
 

Detailed Description

Definition at line 10 of file ProcessingOptionsHandler.h.

Constructor & Destructor Documentation

art::ProcessingOptionsHandler::ProcessingOptionsHandler ( bpo::options_description &  desc)
explicit

Definition at line 48 of file ProcessingOptionsHandler.cc.

50 {
51  bpo::options_description processing_options{"Processing options"};
52  // clang-format off
53  processing_options.add_options()
54  ("parallelism,j",
55  bpo::value<int>(),
56  "Number of threads AND schedules to use for event processing "
57  "(default = 1, 0 = all cores).")
58  ("nschedules",
59  bpo::value<int>(),
60  "Number of schedules to use for event processing (default = 1)")
61  // Note: tbb wants nthreads to be an int!
62  ("nthreads",
63  bpo::value<int>(),
64  "Number of threads to use for event processing (default = 1, 0 = all "
65  "cores)")
66  ("default-exceptions",
67  "Some exceptions may be handled differently by default (e.g. "
68  "ProductNotFound).")
69  ("rethrow-default", "All exceptions default to rethrow.")
70  ("rethrow-all",
71  "All exceptions overridden to rethrow (cf rethrow-default).")
72  ("errorOnMissingConsumes",
73  bpo::value<bool>()->implicit_value(true, "true"),
74  "If 'true', then an exception will be thrown if any module attempts "
75  "to retrieve a product via the 'getBy*' interface without specifying "
76  "the appropriate 'consumes<T>(...)' statement in the module constructor.")
77  ("errorOnSIGINT",
78  bpo::value<bool>()->implicit_value(true, "true"),
79  "If 'true', a signal received from the user yields an art return code "
80  "corresponding to an error; otherwise return 0.");
81  // clang-format on
82  desc.add(processing_options);
83 }

Member Function Documentation

int art::ProcessingOptionsHandler::doCheckOptions ( bpo::variables_map const &  vm)
overrideprivatevirtual

Implements art::OptionsHandler.

Definition at line 86 of file ProcessingOptionsHandler.cc.

87 {
88  if ((vm.count("rethrow-all") + vm.count("rethrow-default") +
89  vm.count("no-rethrow-default")) > 1) {
91  << "Options --default-exceptions, --rethrow-all, and --rethrow-default "
92  "\n"
93  << "are mutually incompatible.\n";
94  }
95 
96  // 'parallelism' is incompatible with either 'nthreads' or
97  // 'nschedules'.
98  if (vm.count("parallelism")) {
99  if (vm.count("nthreads") or vm.count("nschedules")) {
100  throw Exception(errors::Configuration) << "The -j/--parallelism option "
101  "cannot be used with either "
102  "--nthreads or --nschedules.\n";
103  }
104  }
105 
106  if (vm.count("nthreads") and vm["nthreads"].as<int>() < 0) {
108  << "Option --nthreads must greater than or equal to 0.";
109  }
110  if (vm.count("nschedules") and vm["nschedules"].as<int>() < 1) {
112  << "Option --nschedules must be at least 1.\n";
113  }
114  return 0;
115 }
cet::coded_exception< errors::ErrorCodes, ExceptionDetail::translate > Exception
Definition: Exception.h:66
int art::ProcessingOptionsHandler::doProcessOptions ( bpo::variables_map const &  vm,
fhicl::intermediate_table raw_config 
)
overrideprivatevirtual

Implements art::OptionsHandler.

Definition at line 118 of file ProcessingOptionsHandler.cc.

121 {
122  auto const scheduler_key = fhicl_key("services", "scheduler");
123 
124  if (vm.count("rethrow-all") == 1 || vm.count("rethrow-default") == 1) {
125  raw_config.put(fhicl_key(scheduler_key, "defaultExceptions"), false);
126  if (vm.count("rethrow-all") == 1) {
127  raw_config.putEmptySequence(fhicl_key(scheduler_key, "IgnoreCompletely"));
128  raw_config.putEmptySequence(fhicl_key(scheduler_key, "SkipEvent"));
129  raw_config.putEmptySequence(fhicl_key(scheduler_key, "FailModule"));
130  raw_config.putEmptySequence(fhicl_key(scheduler_key, "FailPath"));
131  }
132  }
133 
134  fillTable("errorOnMissingConsumes",
135  fhicl_key(scheduler_key, "errorOnMissingConsumes"),
136  vm,
137  raw_config,
138  false);
139  fillTable("errorOnSIGINT",
140  fhicl_key(scheduler_key, "errorOnSIGINT"),
141  vm,
142  raw_config,
143  true);
144 
145  auto const num_schedules_key = fhicl_key(scheduler_key, "num_schedules");
146  auto const num_threads_key = fhicl_key(scheduler_key, "num_threads");
147  if (vm.count("parallelism")) {
148  // 'nthreads' and 'nschedules' are set to the same value.
149  auto const j = vm["parallelism"].as<int>();
150  auto const nthreads =
151  (j == 0) ? tbb::this_task_arena::max_concurrency() : j;
152  raw_config.put(num_schedules_key, nthreads);
153  raw_config.put(num_threads_key, nthreads);
154  return 0;
155  }
156 
157  if (vm.count("nschedules")) {
158  raw_config.put(num_schedules_key, vm["nschedules"].as<int>());
159  }
160  if (vm.count("nthreads")) {
161  auto const nt = vm["nthreads"].as<int>();
162  auto const nthreads =
163  (nt == 0) ? tbb::this_task_arena::max_concurrency() : nt;
164  raw_config.put(num_threads_key, nthreads);
165  }
166 
167  // If 'nschedules' or 'nthreads' does not exist in configuration,
168  // assign the default value of 1.
169  if (not exists_outside_prolog(raw_config, num_schedules_key)) {
170  raw_config.put(num_schedules_key, 1);
171  }
172  if (not exists_outside_prolog(raw_config, num_threads_key)) {
173  raw_config.put(num_threads_key, 1);
174  }
175 
176  return 0;
177 }
bool exists_outside_prolog(fhicl::intermediate_table const &config, std::string const &key)
bool putEmptySequence(std::string const &name, bool in_prolog=false)
std::enable_if_t< std::is_convertible_v< T, std::string >, std::string > fhicl_key(T const &name)
Definition: fhicl_key.h:12
bool put(std::string const &name, std::string const &value, bool in_prolog=false)

The documentation for this class was generated from the following files: