25#include <DebugGUI/icons_font_awesome.h>
27#include "DebugGUI/imgui.h"
40 ImGui::TextUnformatted(title);
42 ImGui::TextUnformatted(
"Name");
44 ImGui::TextUnformatted(
"Port");
47 ImGui::TextUnformatted(channel.name.c_str());
49 ImGui::Text(
"%d", channel.port);
58 static std::vector<char> statesActive(
states.statesViews.size(),
false);
59 if (statesActive.size() !=
states.statesViews.size()) {
60 statesActive.resize(
states.statesViews.size(),
false);
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()) {
68 auto& view =
states.statesViews[
i];
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);
82template <
typename Routes>
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;
94 while (input != endInputs) {
95 auto end = std::find(input, endInputs,
';');
96 if ((
end - input) == 0) {
100 if (ImGui::IsItemHovered()) {
101 ImGui::BeginTooltip();
112 boost::property_tree::ptree
const& currentProvenance)
114 if (currentConfig.empty()) {
117 if (ImGui::CollapsingHeader(
"Current Config", ImGuiTreeNodeFlags_DefaultOpen)) {
119 auto labels = {
"Name",
"Value"};
121 ImGui::TextUnformatted(
label);
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());
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());
146 if (options.empty()) {
149 if (ImGui::CollapsingHeader(
label, ImGuiTreeNodeFlags_DefaultOpen)) {
151 auto labels = {
"Name",
"Value"};
153 ImGui::TextUnformatted(
label);
156 for (
auto&
option : options) {
157 ImGui::TextUnformatted(
option.name.c_str());
162 if (currentValueIt == control.
options.end()) {
165 ImGui::Text(R
"("%s" (default))", option.defaultValue.get<const char*>());
168 ImGui::Text(
"%d (default)",
option.defaultValue.get<
int>());
171 ImGui::Text(
"%d (default)",
option.defaultValue.get<
int8_t>());
174 ImGui::Text(
"%d (default)",
option.defaultValue.get<int16_t>());
177 ImGui::Text(
"%" PRId64
" (default)",
option.defaultValue.get<int64_t>());
180 ImGui::Text(
"%d (default)",
option.defaultValue.get<
uint8_t>());
189 ImGui::Text(
"%" PRIu64
" (default)",
option.defaultValue.get<
uint64_t>());
192 ImGui::Text(
"%f (default)",
option.defaultValue.get<
float>());
195 ImGui::Text(
"%f (default)",
option.defaultValue.get<
double>());
198 ImGui::TextUnformatted(
"");
201 ImGui::TextUnformatted(
"unknown");
204 ImGui::TextUnformatted(currentValueIt->second.c_str());
215 if (services.empty()) {
218 if (ImGui::CollapsingHeader(
label, ImGuiTreeNodeFlags_DefaultOpen)) {
220 auto labels = {
"Service",
"Kind"};
222 ImGui::TextUnformatted(
label);
225 for (
auto& service : services) {
226 if (!service.name.empty()) {
227 ImGui::TextUnformatted(service.name.c_str());
229 ImGui::TextUnformatted(
"unknown");
232 switch (service.kind) {
234 ImGui::TextUnformatted(
"Serial");
237 ImGui::TextUnformatted(
"Global");
240 ImGui::TextUnformatted(
"Stream");
243 ImGui::TextUnformatted(
"unknown");
259 ImGui::Text(
"Name: %s", spec.
name.c_str());
260 ImGui::Text(
"Executable: %s", metadata.
executable.c_str());
262 ImGui::Text(
"Pid: %d", info.pid);
264 ImGui::Text(
"Pid: %d (exit status: %d)", info.pid, info.exitStatus);
266 ImGui::Text(
"Device state: %s", info.deviceState.data());
269 if (ImGui::Button(ICON_FA_BUG
"Attach debugger")) {
271 setenv(
"O2DEBUGGEDPID",
pid.c_str(), 1);
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);
278 setenv(
"O2DPLDEBUG",
"xterm -hold -e gdb attach $O2DEBUGGEDPID &", 0);
280 int retVal = system(getenv(
"O2DPLDEBUG"));
285 if (ImGui::Button(
"Profile 30s")) {
287 setenv(
"O2PROFILEDPID",
pid.c_str(), 1);
289 auto defaultAppleProfileCommand = fmt::format(
290 "osascript -e 'tell application \"Terminal\"'"
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\"'"
298 setenv(
"O2DPLPROFILE", defaultAppleProfileCommand.c_str(), 0);
300 setenv(
"O2DPLPROFILE",
"xterm -hold -e perf record -a -g -p $O2PROFILEDPID > perf-$O2PROFILEDPID.data &", 0);
302 LOG(
error) << getenv(
"O2DPLPROFILE");
303 int retVal = system(getenv(
"O2DPLPROFILE"));
308 if (ImGui::Button(
"Profile Allocations 30s")) {
310 setenv(
"O2PROFILEDPID",
pid.c_str(), 1);
311 auto defaultAppleProfileCommand = fmt::format(
312 "osascript -e 'tell application \"Terminal\"'"
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\"'"
320 setenv(
"O2DPLPROFILE", defaultAppleProfileCommand.c_str(), 0);
321 LOG(
error) << getenv(
"O2DPLPROFILE");
322 int retVal = system(getenv(
"O2DPLPROFILE"));
328 if (ImGui::Button(
"Offer SHM")) {
329 control.
controller->
write(
"/shm-offer 1000", strlen(
"/shm-offer 1000"));
332 if (ImGui::Button(
"Offer timeslices")) {
333 control.
controller->
write(
"/timeslice-offer 1", strlen(
"/timeslice-offer 1"));
337 ImGui::Text(ICON_FA_CLOCK_O);
339 if (ImGui::Button(
"Restart")) {
351 if (ImGui::CollapsingHeader(
"Labels", ImGuiTreeNodeFlags_DefaultOpen)) {
353 ImGui::Text(
"%s",
label.value.c_str());
357 if (ImGui::CollapsingHeader(
"Command line arguments", ImGuiTreeNodeFlags_DefaultOpen)) {
358 static ImGuiTextFilter
filter;
359 filter.Draw(ICON_FA_SEARCH);
361 if (
filter.PassFilter(arg.c_str())) {
362 ImGui::TextUnformatted(arg.c_str());
367 if (ImGui::CollapsingHeader(
"Channels", ImGuiTreeNodeFlags_DefaultOpen)) {
372 if (ImGui::CollapsingHeader(
"Policies")) {
378 if (ImGui::CollapsingHeader(
"Signals", ImGuiTreeNodeFlags_DefaultOpen)) {
379 if (ImGui::Button(
"SIGSTOP")) {
380 kill(info.pid, SIGSTOP);
383 if (ImGui::Button(
"SIGTERM")) {
384 kill(info.pid, SIGTERM);
387 if (ImGui::Button(
"SIGKILL")) {
388 kill(info.pid, SIGKILL);
390 if (ImGui::Button(
"SIGCONT")) {
391 kill(info.pid, SIGCONT);
394 if (ImGui::Button(
"SIGUSR1")) {
395 kill(info.pid, SIGUSR1);
398 if (ImGui::Button(
"SIGUSR2")) {
399 kill(info.pid, SIGUSR2);
403 if (ImGui::CollapsingHeader(
"Signposts", ImGuiTreeNodeFlags_DefaultOpen)) {
404 static const struct {
407 const char* fullName;
415 for (
auto const&
s : kStreams) {
418 std::string cmd =
enabled ? fmt::format(
"/signpost:enable {}",
s.fullName)
419 : fmt::format(
"/signpost:disable {}",
s.fullName);
425 bool flagsChanged =
false;
426 if (ImGui::CollapsingHeader(
"Event loop tracing", ImGuiTreeNodeFlags_DefaultOpen)) {
447 std::string cmd = fmt::format(
"/trace {}", control.
tracingFlags);
std::vector< OutputRoute > routes
unsigned short int uint16_t
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
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
GLuint GLsizei const GLchar * label
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
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 ¤tConfig, boost::property_tree::ptree const ¤tProvenance)
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)
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
std::vector< InputRoute > inputs
size_t maxInputTimeslices
The maximum number of time pipelining for this device.
CompletionPolicy completionPolicy
The completion policy to use for this device.
std::vector< OutputChannelSpec > outputChannels
std::string name
The name of the associated DataProcessorSpec.
size_t inputTimesliceId
The time pipelining id of this particular device.
std::vector< OutputRoute > outputs
DispatchPolicy dispatchPolicy
SendingPolicy sendingPolicy
std::vector< InputChannelSpec > inputChannels
std::vector< ServiceSpec > services
@ DATA_PROCESSOR_CONTEXT_LOG
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