Project
Loading...
Searching...
No Matches
FrameworkGUIDeviceInspector.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
20#include "Framework/Logger.h"
23#include "Framework/Signpost.h"
24#include "InspectorHelpers.h"
25#include <DebugGUI/icons_font_awesome.h>
26
27#include "DebugGUI/imgui.h"
28#include <cinttypes>
29#include <csignal>
30#include <cstdlib>
31#include <iostream>
32
33namespace o2::framework::gui
34{
35
37 template <typename C>
38 static void channelsTable(const char* title, const C& channels)
39 {
40 ImGui::TextUnformatted(title);
41 ImGui::Columns(2);
42 ImGui::TextUnformatted("Name");
43 ImGui::NextColumn();
44 ImGui::TextUnformatted("Port");
45 ImGui::NextColumn();
46 for (auto channel : channels) {
47 ImGui::TextUnformatted(channel.name.c_str());
48 ImGui::NextColumn();
49 ImGui::Text("%d", channel.port);
50 ImGui::NextColumn();
51 }
52 ImGui::Columns(1);
53 }
54};
55
57{
58 static std::vector<char> statesActive(states.statesViews.size(), false);
59 if (statesActive.size() != states.statesViews.size()) {
60 statesActive.resize(states.statesViews.size(), false);
61 }
62
63 if (ImGui::CollapsingHeader("Remote state", ImGuiTreeNodeFlags_DefaultOpen)) {
64 for (size_t i = 0; i < states.stateNames.size(); ++i) {
65 if (states.stateNames[i].empty()) {
66 continue;
67 }
68 auto& view = states.statesViews[i];
69 if (view.size == 0) {
70 continue;
71 }
72 ImGui::Checkbox(states.stateNames[i].c_str(), (bool*)&statesActive[i]);
73 if (view.size && statesActive[i] != 0) {
74 ImGui::Begin(states.stateNames[i].c_str());
75 ImGui::Text("%d-%d\n %.*s", view.first, view.first + view.size, view.size, states.statesBuffer.data() + view.first);
76 ImGui::End();
77 }
78 }
79 }
80}
81
82template <typename Routes>
84{
85 // Find the state spec associated to data_queries
86 auto& view = states.statesViews[(int)id];
87 if (ImGui::CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen)) {
88 std::string_view inputs(states.statesBuffer.data() + view.first, view.size);
89 auto beginInputs = inputs.begin();
90 auto endInputs = beginInputs + view.size;
91 char const* input = beginInputs;
92 size_t i = 0;
93 // Iterate on the ; delimited string_views inside inputs
94 while (input != endInputs) {
95 auto end = std::find(input, endInputs, ';');
96 if ((end - input) == 0) {
97 continue;
98 }
99 ImGui::Text("%zu: %.*s (%s)", i, int(end - input), input, InspectorHelpers::getLifeTimeStr(routes[i].matcher.lifetime));
100 if (ImGui::IsItemHovered()) {
101 ImGui::BeginTooltip();
102 ImGui::Text("%zu: %.*s (%s)", i, int(end - input), input, InspectorHelpers::getLifeTimeStr(routes[i].matcher.lifetime));
103 ImGui::EndTooltip();
104 }
105 input = end + 1;
106 ++i;
107 }
108 }
109}
110
111void configurationTable(boost::property_tree::ptree const& currentConfig,
112 boost::property_tree::ptree const& currentProvenance)
113{
114 if (currentConfig.empty()) {
115 return;
116 }
117 if (ImGui::CollapsingHeader("Current Config", ImGuiTreeNodeFlags_DefaultOpen)) {
118 ImGui::Columns(2);
119 auto labels = {"Name", "Value"};
120 for (auto& label : labels) {
121 ImGui::TextUnformatted(label);
122 ImGui::NextColumn();
123 }
124 for (auto& option : currentConfig) {
125 ImGui::TextUnformatted(option.first.c_str());
126 if (ImGui::IsItemHovered()) {
127 ImGui::BeginTooltip();
128 ImGui::TextUnformatted(option.first.c_str());
129 ImGui::EndTooltip();
130 }
131 ImGui::NextColumn();
132 ImGui::Text("%s (%s)", option.second.data().c_str(), currentProvenance.get<std::string>(option.first).c_str());
133 if (ImGui::IsItemHovered()) {
134 ImGui::BeginTooltip();
135 ImGui::Text("%s (%s)", option.second.data().c_str(), currentProvenance.get<std::string>(option.first).c_str());
136 ImGui::EndTooltip();
137 }
138 ImGui::NextColumn();
139 }
140 ImGui::Columns(1);
141 }
142}
143
144void optionsTable(const char* label, std::vector<ConfigParamSpec> const& options, const DeviceControl& control)
145{
146 if (options.empty()) {
147 return;
148 }
149 if (ImGui::CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen)) {
150 ImGui::Columns(2);
151 auto labels = {"Name", "Value"};
152 for (auto& label : labels) {
153 ImGui::TextUnformatted(label);
154 ImGui::NextColumn();
155 }
156 for (auto& option : options) {
157 ImGui::TextUnformatted(option.name.c_str());
158 ImGui::NextColumn();
159 auto currentValueIt = control.options.find(option.name);
160
161 // Did not find the option
162 if (currentValueIt == control.options.end()) {
163 switch (option.type) {
165 ImGui::Text(R"("%s" (default))", option.defaultValue.get<const char*>());
166 break;
167 case VariantType::Int:
168 ImGui::Text("%d (default)", option.defaultValue.get<int>());
169 break;
171 ImGui::Text("%d (default)", option.defaultValue.get<int8_t>());
172 break;
174 ImGui::Text("%d (default)", option.defaultValue.get<int16_t>());
175 break;
177 ImGui::Text("%" PRId64 " (default)", option.defaultValue.get<int64_t>());
178 break;
180 ImGui::Text("%d (default)", option.defaultValue.get<uint8_t>());
181 break;
183 ImGui::Text("%d (default)", option.defaultValue.get<uint16_t>());
184 break;
186 ImGui::Text("%d (default)", option.defaultValue.get<uint32_t>());
187 break;
189 ImGui::Text("%" PRIu64 " (default)", option.defaultValue.get<uint64_t>());
190 break;
192 ImGui::Text("%f (default)", option.defaultValue.get<float>());
193 break;
195 ImGui::Text("%f (default)", option.defaultValue.get<double>());
196 break;
198 ImGui::TextUnformatted(""); // no default value
199 break;
200 default:
201 ImGui::TextUnformatted("unknown");
202 }
203 } else {
204 ImGui::TextUnformatted(currentValueIt->second.c_str());
205 }
206 ImGui::NextColumn();
207 }
208 }
209
210 ImGui::Columns(1);
211}
212
213void servicesTable(const char* label, std::vector<ServiceSpec> const& services)
214{
215 if (services.empty()) {
216 return;
217 }
218 if (ImGui::CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen)) {
219 ImGui::Columns(2);
220 auto labels = {"Service", "Kind"};
221 for (auto& label : labels) {
222 ImGui::TextUnformatted(label);
223 ImGui::NextColumn();
224 }
225 for (auto& service : services) {
226 if (!service.name.empty()) {
227 ImGui::TextUnformatted(service.name.c_str());
228 } else {
229 ImGui::TextUnformatted("unknown");
230 }
231 ImGui::NextColumn();
232 switch (service.kind) {
234 ImGui::TextUnformatted("Serial");
235 break;
237 ImGui::TextUnformatted("Global");
238 break;
240 ImGui::TextUnformatted("Stream");
241 break;
242 default:
243 ImGui::TextUnformatted("unknown");
244 }
245 ImGui::NextColumn();
246 }
247 }
248
249 ImGui::Columns(1);
250}
251
253 DeviceInfo const& info,
256 DataProcessorInfo const& metadata,
257 DeviceControl& control)
258{
259 ImGui::Text("Name: %s", spec.name.c_str());
260 ImGui::Text("Executable: %s", metadata.executable.c_str());
261 if (info.active) {
262 ImGui::Text("Pid: %d", info.pid);
263 } else {
264 ImGui::Text("Pid: %d (exit status: %d)", info.pid, info.exitStatus);
265 }
266 ImGui::Text("Device state: %s", info.deviceState.data());
267 ImGui::Text("Rank: %zu/%zu%%%zu/%zu", spec.rank, spec.nSlots, spec.inputTimesliceId, spec.maxInputTimeslices);
268
269 if (ImGui::Button(ICON_FA_BUG "Attach debugger")) {
270 std::string pid = std::to_string(info.pid);
271 setenv("O2DEBUGGEDPID", pid.c_str(), 1);
272#ifdef __APPLE__
273 std::string defaultAppleDebugCommand =
274 "osascript -e 'tell application \"Terminal\" to activate'"
275 " -e 'tell application \"Terminal\" to do script \"lldb -p \" & (system attribute \"O2DEBUGGEDPID\") & \"; exit\"'";
276 setenv("O2DPLDEBUG", defaultAppleDebugCommand.c_str(), 0);
277#else
278 setenv("O2DPLDEBUG", "xterm -hold -e gdb attach $O2DEBUGGEDPID &", 0);
279#endif
280 int retVal = system(getenv("O2DPLDEBUG"));
281 (void)retVal;
282 }
283
284 ImGui::SameLine();
285 if (ImGui::Button("Profile 30s")) {
286 std::string pid = std::to_string(info.pid);
287 setenv("O2PROFILEDPID", pid.c_str(), 1);
288#ifdef __APPLE__
289 auto defaultAppleProfileCommand = fmt::format(
290 "osascript -e 'tell application \"Terminal\"'"
291 " -e 'activate'"
292 " -e 'do script \"xcrun xctrace record --output dpl-profile-{0}.trace"
293 " --instrument os_signpost --time-limit 30s --template Time\\\\ Profiler --attach {0} "
294 " && open dpl-profile-{0}.trace && exit\"'"
295 " -e 'end tell'",
296 pid);
297
298 setenv("O2DPLPROFILE", defaultAppleProfileCommand.c_str(), 0);
299#else
300 setenv("O2DPLPROFILE", "xterm -hold -e perf record -a -g -p $O2PROFILEDPID > perf-$O2PROFILEDPID.data &", 0);
301#endif
302 LOG(error) << getenv("O2DPLPROFILE");
303 int retVal = system(getenv("O2DPLPROFILE"));
304 (void)retVal;
305 }
306
307#ifdef __APPLE__
308 if (ImGui::Button("Profile Allocations 30s")) {
309 std::string pid = std::to_string(info.pid);
310 setenv("O2PROFILEDPID", pid.c_str(), 1);
311 auto defaultAppleProfileCommand = fmt::format(
312 "osascript -e 'tell application \"Terminal\"'"
313 " -e 'activate'"
314 " -e 'do script \"xcrun xctrace record --output dpl-profile-{0}.trace"
315 " --time-limit 30s --instrument os_signpost --template Allocations --attach {0} "
316 " && open dpl-profile-{0}.trace && exit\"'"
317 " -e 'end tell'",
318 pid);
319
320 setenv("O2DPLPROFILE", defaultAppleProfileCommand.c_str(), 0);
321 LOG(error) << getenv("O2DPLPROFILE");
322 int retVal = system(getenv("O2DPLPROFILE"));
323 (void)retVal;
324 }
325#endif
326
327 if (control.controller) {
328 if (ImGui::Button("Offer SHM")) {
329 control.controller->write("/shm-offer 1000", strlen("/shm-offer 1000"));
330 }
331
332 if (ImGui::Button("Offer timeslices")) {
333 control.controller->write("/timeslice-offer 1", strlen("/timeslice-offer 1"));
334 }
335
336 if (control.requestedState > info.providedState) {
337 ImGui::Text(ICON_FA_CLOCK_O);
338 } else {
339 if (ImGui::Button("Restart")) {
340 control.requestedState = info.providedState + 1;
341 control.controller->write("/restart", strlen("/restart"));
342 }
343 }
344 }
345
349 configurationTable(info.currentConfig, info.currentProvenance);
350 optionsTable("Workflow Options", metadata.workflowOptions, control);
351 if (ImGui::CollapsingHeader("Labels", ImGuiTreeNodeFlags_DefaultOpen)) {
352 for (auto& label : spec.labels) {
353 ImGui::Text("%s", label.value.c_str());
354 }
355 }
356 servicesTable("Services", spec.services);
357 if (ImGui::CollapsingHeader("Command line arguments", ImGuiTreeNodeFlags_DefaultOpen)) {
358 static ImGuiTextFilter filter;
359 filter.Draw(ICON_FA_SEARCH);
360 for (auto& arg : metadata.cmdLineArgs) {
361 if (filter.PassFilter(arg.c_str())) {
362 ImGui::TextUnformatted(arg.c_str());
363 }
364 }
365 }
366
367 if (ImGui::CollapsingHeader("Channels", ImGuiTreeNodeFlags_DefaultOpen)) {
368 ImGui::Text("# channels: %lu", spec.inputChannels.size() + spec.outputChannels.size());
371 }
372 if (ImGui::CollapsingHeader("Policies")) {
373 ImGui::Text("Completion: %s", spec.completionPolicy.name.c_str());
374 ImGui::Text("Sending: %s", spec.sendingPolicy.name.c_str());
375 ImGui::Text("Dispatching: %s", spec.dispatchPolicy.name.c_str());
376 }
377
378 if (ImGui::CollapsingHeader("Signals", ImGuiTreeNodeFlags_DefaultOpen)) {
379 if (ImGui::Button("SIGSTOP")) {
380 kill(info.pid, SIGSTOP);
381 }
382 ImGui::SameLine();
383 if (ImGui::Button("SIGTERM")) {
384 kill(info.pid, SIGTERM);
385 }
386 ImGui::SameLine();
387 if (ImGui::Button("SIGKILL")) {
388 kill(info.pid, SIGKILL);
389 }
390 if (ImGui::Button("SIGCONT")) {
391 kill(info.pid, SIGCONT);
392 }
393 ImGui::SameLine();
394 if (ImGui::Button("SIGUSR1")) {
395 kill(info.pid, SIGUSR1);
396 }
397 ImGui::SameLine();
398 if (ImGui::Button("SIGUSR2")) {
399 kill(info.pid, SIGUSR2);
400 }
401 }
402
403 if (ImGui::CollapsingHeader("Signposts", ImGuiTreeNodeFlags_DefaultOpen)) {
404 static const struct {
405 const char* label;
406 int bit;
407 const char* fullName;
408 } kStreams[] = {
409 {"Device", DeviceState::LogStreams::DEVICE_LOG, "ch.cern.aliceo2.device"},
410 {"Completion", DeviceState::LogStreams::COMPLETION_LOG, "ch.cern.aliceo2.completion"},
411 {"Monitoring", DeviceState::LogStreams::MONITORING_SERVICE_LOG, "ch.cern.aliceo2.monitoring_service"},
412 {"DataProcessorContext", DeviceState::LogStreams::DATA_PROCESSOR_CONTEXT_LOG, "ch.cern.aliceo2.data_processor_context"},
413 {"StreamContext", DeviceState::LogStreams::STREAM_CONTEXT_LOG, "ch.cern.aliceo2.stream_context"},
414 };
415 for (auto const& s : kStreams) {
416 if (ImGui::CheckboxFlags(s.label, &control.logStreams, s.bit) && control.controller) {
417 bool enabled = (control.logStreams & s.bit) != 0;
418 std::string cmd = enabled ? fmt::format("/signpost:enable {}", s.fullName)
419 : fmt::format("/signpost:disable {}", s.fullName);
420 control.controller->write(cmd.c_str(), cmd.size());
421 }
422 }
423 }
424
425 bool flagsChanged = false;
426 if (ImGui::CollapsingHeader("Event loop tracing", ImGuiTreeNodeFlags_DefaultOpen)) {
427 flagsChanged |= ImGui::CheckboxFlags("METRICS_MUST_FLUSH", &control.tracingFlags, DeviceState::LoopReason::METRICS_MUST_FLUSH);
428 flagsChanged |= ImGui::CheckboxFlags("SIGNAL_ARRIVED", &control.tracingFlags, DeviceState::LoopReason::SIGNAL_ARRIVED);
429 flagsChanged |= ImGui::CheckboxFlags("DATA_SOCKET_POLLED", &control.tracingFlags, DeviceState::LoopReason::DATA_SOCKET_POLLED);
430 flagsChanged |= ImGui::CheckboxFlags("DATA_INCOMING", &control.tracingFlags, DeviceState::LoopReason::DATA_INCOMING);
431 flagsChanged |= ImGui::CheckboxFlags("DATA_OUTGOING", &control.tracingFlags, DeviceState::LoopReason::DATA_OUTGOING);
432 flagsChanged |= ImGui::CheckboxFlags("WS_COMMUNICATION", &control.tracingFlags, DeviceState::LoopReason::WS_COMMUNICATION);
433 flagsChanged |= ImGui::CheckboxFlags("TIMER_EXPIRED", &control.tracingFlags, DeviceState::LoopReason::TIMER_EXPIRED);
434 flagsChanged |= ImGui::CheckboxFlags("WS_CONNECTED", &control.tracingFlags, DeviceState::LoopReason::WS_CONNECTED);
435 flagsChanged |= ImGui::CheckboxFlags("WS_CLOSING", &control.tracingFlags, DeviceState::LoopReason::WS_CLOSING);
436 flagsChanged |= ImGui::CheckboxFlags("WS_READING", &control.tracingFlags, DeviceState::LoopReason::WS_READING);
437 flagsChanged |= ImGui::CheckboxFlags("WS_WRITING", &control.tracingFlags, DeviceState::LoopReason::WS_WRITING);
438 flagsChanged |= ImGui::CheckboxFlags("ASYNC_NOTIFICATION", &control.tracingFlags, DeviceState::LoopReason::ASYNC_NOTIFICATION);
439 flagsChanged |= ImGui::CheckboxFlags("OOB_ACTIVITY", &control.tracingFlags, DeviceState::LoopReason::OOB_ACTIVITY);
440 flagsChanged |= ImGui::CheckboxFlags("UNKNOWN", &control.tracingFlags, DeviceState::LoopReason::UNKNOWN);
441 flagsChanged |= ImGui::CheckboxFlags("FIRST_LOOP", &control.tracingFlags, DeviceState::LoopReason::FIRST_LOOP);
442 flagsChanged |= ImGui::CheckboxFlags("NEW_STATE_PENDING", &control.tracingFlags, DeviceState::LoopReason::NEW_STATE_PENDING);
443 flagsChanged |= ImGui::CheckboxFlags("PREVIOUSLY_ACTIVE", &control.tracingFlags, DeviceState::LoopReason::PREVIOUSLY_ACTIVE);
444 flagsChanged |= ImGui::CheckboxFlags("TRACE_CALLBACKS", &control.tracingFlags, DeviceState::LoopReason::TRACE_CALLBACKS);
445 flagsChanged |= ImGui::CheckboxFlags("TRACE_USERCODE", &control.tracingFlags, DeviceState::LoopReason::TRACE_USERCODE);
446 if (flagsChanged && control.controller) {
447 std::string cmd = fmt::format("/trace {}", control.tracingFlags);
448 control.controller->write(cmd.c_str(), cmd.size());
449 }
450 }
451}
452
453} // namespace o2::framework::gui
std::vector< OutputRoute > routes
unsigned char uint8_t
unsigned short int uint16_t
unsigned int uint32_t
int32_t i
int32_t retVal
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error s
Timeframe settings Average distance in cm of events merged into Randomize distance around average distance of merged events Simulate correct bunch interactions instead of placing only the average number of events A value[n] sets TFlen for[n] collisions in Number of bunches per trainsort Number of bunch trains Instantaneous interaction rate Do not simulate border Total number of collisions to be placed in the interior of all time Do not select random but walk over array of events in stride steps h Event generator settings h configStandalone Use CPU for GPU Force usage of the specified GPU device no CPU fallback Continue processing after an error First event to Number of events to Number of iterations to Number of iterations to Number of initial iterations excluded from const char Directory with events to Events directory is and not inside events Show standalone event Run event generator maximum time bin of continuous for triggered for automatic continuous for automatic continuous triggered uint64_t
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc Replace constant variables static by constexpr expressions Compile RTC in deterministic with NO_FAST_MATH flags and GPUCA_DETERMINISTIC_MODE define Use RTC to optimize GPU code h configStandalone Processing proc_rtctech Use a file lock to serialize access to the cache folder Print launch bounds used for RTC code as debugging option
char error[CURL_ERROR_SIZE]
std::vector< o2::MCCompLabel > labels
uint16_t pid
Definition RawData.h:2
GLuint GLuint end
Definition glcorearb.h:469
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition glcorearb.h:2513
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
Definition glcorearb.h:5500
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition glcorearb.h:1308
State for the main GUI window.
void servicesTable(const char *label, std::vector< ServiceSpec > const &services)
void deviceStateTable(DataProcessingStates const &states)
void deviceInfoTable(char const *label, ProcessingStateId id, DataProcessingStates const &states, Routes const &routes, DeviceMetricsInfo const &metrics)
void configurationTable(boost::property_tree::ptree const &currentConfig, boost::property_tree::ptree const &currentProvenance)
void displayDeviceInspector(DeviceSpec const &spec, DeviceInfo const &info, DataProcessingStates const &states, DeviceMetricsInfo const &metrics, DataProcessorInfo const &metadata, DeviceControl &control)
Helper to display information about a device.
void optionsTable(const char *label, std::vector< ConfigParamSpec > const &options, const DeviceControl &control)
ProcessingStateId
Helper struct to define some known states.
std::string to_string(gsl::span< T, Size > span)
Definition common.h:52
std::string name
Name of the policy itself.
std::vector< ConfigParamSpec > workflowOptions
The workflow options which are available for the associated DataProcessorSpec.
std::vector< std::string > cmdLineArgs
The argument passed on the command line for this DataProcessorSpec.
std::string executable
The executable name of the program which holds the DataProcessorSpec.
int logStreams
What kind of log streams should be enabled.
DeviceController * controller
Handler used to communicate with the device (if available)
std::map< std::string, std::string > options
Where the GUI should store the options it wants.
int requestedState
An incremental number to identify the device state.
int tracingFlags
What kind of events should run with the TRACE level.
void write(const char *message, size_t s)
std::vector< DataProcessorLabel > labels
Definition DeviceSpec.h:81
std::vector< InputRoute > inputs
Definition DeviceSpec.h:62
size_t maxInputTimeslices
The maximum number of time pipelining for this device.
Definition DeviceSpec.h:70
CompletionPolicy completionPolicy
The completion policy to use for this device.
Definition DeviceSpec.h:72
std::vector< OutputChannelSpec > outputChannels
Definition DeviceSpec.h:55
std::string name
The name of the associated DataProcessorSpec.
Definition DeviceSpec.h:50
size_t inputTimesliceId
The time pipelining id of this particular device.
Definition DeviceSpec.h:68
std::vector< OutputRoute > outputs
Definition DeviceSpec.h:63
DispatchPolicy dispatchPolicy
Definition DeviceSpec.h:73
SendingPolicy sendingPolicy
Definition DeviceSpec.h:75
std::vector< InputChannelSpec > inputChannels
Definition DeviceSpec.h:54
std::vector< ServiceSpec > services
Definition DeviceSpec.h:58
std::string name
Name of the policy itself.
static const char * getLifeTimeStr(Lifetime lifetime)
static void channelsTable(const char *title, const C &channels)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< ChannelData > channels