tabbed frametype filtering

This commit is contained in:
2025-07-30 23:48:32 -04:00
parent 8d883f25c3
commit bb3eeb79d0
92 changed files with 33696 additions and 139 deletions

View File

@@ -267,20 +267,46 @@ class SubFlowDetailsPanel(Vertical):
sections.append(Text("Sub-Flow Timing", style="bold cyan"))
sections.append(timing_table)
# Outlier details if any
if subflow.outlier_frames and subflow.outlier_details:
# Enhanced outlier details if any
if subflow.outlier_frames:
outlier_table = Table(show_header=True, box=None)
outlier_table.add_column("Frame#", justify="right")
outlier_table.add_column("Prev Frame#", justify="right")
outlier_table.add_column("ΔT(ms)", justify="right")
outlier_table.add_column("σ Dev", justify="right")
for frame_num, delta_t in subflow.outlier_details[:5]: # Show first 5 outliers
# Use enhanced details if available, fallback to legacy details
outlier_data = []
if hasattr(subflow, 'enhanced_outlier_details') and subflow.enhanced_outlier_details:
for frame_num, prev_frame_num, delta_t in subflow.enhanced_outlier_details[:5]:
# Calculate sigma deviation
sigma_dev = "N/A"
if subflow.std_inter_arrival > 0 and subflow.avg_inter_arrival > 0:
deviation = (delta_t - subflow.avg_inter_arrival) / subflow.std_inter_arrival
sigma_dev = f"{deviation:.1f}σ"
outlier_data.append((frame_num, prev_frame_num, delta_t, sigma_dev))
elif subflow.outlier_details:
for frame_num, delta_t in subflow.outlier_details[:5]:
# Calculate sigma deviation
sigma_dev = "N/A"
if subflow.std_inter_arrival > 0 and subflow.avg_inter_arrival > 0:
deviation = (delta_t - subflow.avg_inter_arrival) / subflow.std_inter_arrival
sigma_dev = f"{deviation:.1f}σ"
outlier_data.append((frame_num, "N/A", delta_t, sigma_dev))
for frame_num, prev_frame_num, delta_t, sigma_dev in outlier_data:
outlier_table.add_row(
str(frame_num),
f"{delta_t * 1000:.1f}"
str(prev_frame_num) if prev_frame_num != "N/A" else "N/A",
f"{delta_t * 1000:.1f}",
sigma_dev
)
if len(subflow.outlier_details) > 5:
outlier_table.add_row("...", f"+{len(subflow.outlier_details) - 5} more")
total_outliers = len(subflow.enhanced_outlier_details) if hasattr(subflow, 'enhanced_outlier_details') else len(subflow.outlier_details)
if total_outliers > 5:
outlier_table.add_row("...", "...", f"+{total_outliers - 5}", "more")
sections.append(Text("Outlier Details", style="bold red"))
sections.append(outlier_table)
@@ -320,16 +346,40 @@ class SubFlowDetailsPanel(Vertical):
reverse=True
):
percentage = (stats.count / total * 100) if total > 0 else 0
delta_t = f"{stats.avg_inter_arrival * 1000:.1f}" if stats.avg_inter_arrival > 0 else "N/A"
sigma = f"{stats.std_inter_arrival * 1000:.1f}" if stats.std_inter_arrival > 0 else "N/A"
# Use same logic as grid rows for consistency
delta_t = ""
if stats.avg_inter_arrival > 0:
dt_ms = stats.avg_inter_arrival * 1000
delta_t = f"{dt_ms:.1f}" if dt_ms < 1000 else f"{dt_ms/1000:.1f}s"
elif len(stats.inter_arrival_times) >= 2:
# Fallback calculation if stored avg is zero
import statistics
avg_arrival = statistics.mean(stats.inter_arrival_times)
if avg_arrival > 0:
dt_ms = avg_arrival * 1000
delta_t = f"{dt_ms:.1f}" if dt_ms < 1000 else f"{dt_ms/1000:.1f}s"
sigma = ""
if stats.std_inter_arrival > 0:
sig_ms = stats.std_inter_arrival * 1000
sigma = f"{sig_ms:.1f}" if sig_ms < 1000 else f"{sig_ms/1000:.1f}s"
elif len(stats.inter_arrival_times) >= 2:
# Fallback calculation if stored std is zero
import statistics
std_arrival = statistics.stdev(stats.inter_arrival_times)
if std_arrival > 0:
sig_ms = std_arrival * 1000
sigma = f"{sig_ms:.1f}" if sig_ms < 1000 else f"{sig_ms/1000:.1f}s"
outliers = str(len(stats.outlier_frames))
frame_table.add_row(
frame_type[:15],
frame_type, # Show full frame type name
f"{stats.count:,}",
f"{percentage:.1f}%",
delta_t,
sigma,
delta_t if delta_t else "N/A",
sigma if sigma else "N/A",
outliers
)