---
name: "skill_log_plot_aplog"
description: "Generate HTML/PNG plots from AP log filter outputs. Invoke when AP filtering is done and the user wants modem activity, tput, reg/signal, or other AP-side plots."
version: "1.0.0"
author: "bytedance"
tags:
  - aplog
  - plot
  - html
  - png
  - debugging
categories:
  - development
  - debugging
dependencies: [skill_log_filter_aplog]
---

# skill_log_plot_aplog

## 适用场景
- 已经拿到 `skill_log_filter_aplog` 产出的 `<section>.txt` 或过滤目录。
- 需要把 AP 侧过滤结果绘制成 HTML / PNG 图表。
- 需要查看以下类型的可视化结果：
  - `power_modem_activityinfo.txt` 的睡眠率 / idle / TX / RX / residual
  - `data_net_netifstats.txt` / `data_net_uidstats.txt` 的按 UID 上下行速率 Mbps 与流量 MB
  - `reg_sim*_data_reg_rat.txt`、`reg_sim*_cell_info.txt` 的注册态 / 信号变化
  - `reg_data_sub_serv_cell.txt` 的 NetworkBrain serving cell 时间轴、4G/5G、信号质量、PCI/Band/Freq 变化

## 路径
```bash
export APLOG_PLOT_SKILL="/home/bytedance/disk4T/jieli/modem_proc_ext/skills/skill_log_workflow/sub_skills/skill_log_plot_aplog"
export APLOG_FILTER_SKILL="/home/bytedance/disk4T/jieli/modem_proc_ext/skills/skill_log_workflow/sub_skills/skill_log_filter_aplog"
export APLOG_FILTER_TOOL="${APLOG_FILTER_SKILL}/scripts/aplog_filter_tool/aplog"
export APLOG_PLOT_TOOL="${APLOG_PLOT_SKILL}/scripts"
```

## 绘图脚本
```bash
${APLOG_PLOT_TOOL}/aplog_plot_modemactivityinfo.py
${APLOG_PLOT_TOOL}/aplog_plot_uid_tput.py
${APLOG_PLOT_TOOL}/aplog_plot_window_overview.py
${APLOG_PLOT_TOOL}/aplog_plot_serving_cell.py
${APLOG_FILTER_TOOL}/additional_tool/aplog_plot_tput.py
${APLOG_FILTER_TOOL}/additional_tool/plot_logcatAplog_reg_signal.py
${APLOG_FILTER_TOOL}/additional_tool/plot_radiolog_1_data_registration_rat.py
${APLOG_FILTER_TOOL}/additional_tool/plot_radiolog_2_lte_nr_signal.py
```

## 推荐命令

### 0. AP 窗口综合 HTML 固定模板
```bash
python3 ${APLOG_PLOT_TOOL}/aplog_plot_window_overview.py \
  --filter-dir <aplog_filter_dir> \
  --start-time "MM-DD HH:MM:SS[.mmm]" \
  --end-time "MM-DD HH:MM:SS[.mmm]" \
  --outdir <output_dir>
```

输出：
- `<filter_name>_window_overview_<start>_<end>.html`
- `<filter_name>_window_overview_<start>_<end>_summary.csv`

固定模板约束（后续同类 AP 综合分析必须遵守）：
- HTML 顶部必须先展示双卡摘要：`SIM/PHONE`、是否主卡、运营商、服务小区窗口、最后服务小区、主要服务小区、RSRP/SINR 统计。
- 主卡/默认数据卡必须从 `data_defaultDataSub.txt` 的 DDS 证据判断，优先使用 `DDS switch success on phoneId = X`，不能凭 SIM1/SIM2 名字猜。
- 服务小区必须同时覆盖卡1和卡2，优先使用 `reg_sim1_data_reg_rat.txt` / `reg_sim2_data_reg_rat.txt` 的窗口内 serving cell。
- 若存在 `data_stats_mobile_uid.txt`，必须纳入窗口综合图；它是 UID 级 mobile radio activeTime / wakeup / bytes 的来源归因，不得只用 `data_net_uidstats.txt` 的 tput 代替。
- 图表顺序固定为：Summary table、RSRP/SINR、Sleep/Idle ratio、RX time、TX time、Avg TX power、Mobile UID activeTime、Mobile UID traffic、Tput rate、Cumulative traffic。
- RX time 和 TX time 必须拆成两个独立子图，不能共用一张图，避免 TX 被 RX 覆盖。
- RX/TX time 必须按真实 interval duration 画柱；`RX=0` / `TX=0` 只能作为灰色短 marker，不得用折线连接成持续 0。
- Avg TX power 只对 `TX>0` 的 interval 按真实 duration 画柱；`TX=0` 只能标记为无 TX 样本，不得画成持续 `0 dBm`。
- tput 速率单位固定为 `Mbps`，流量单位固定为 `MB`；`Bps` 原始字段必须换算后展示。
- `data_stats_mobile_uid.txt` 的 mobile traffic 统一展示为 `MB`，`activeTime` 统一展示为秒和小时；summary CSV 必须包含 `MobileUID` 总计和 Top UID 行。
- 每个子图必须使用独立 legend，并放在对应子图右侧；禁止把所有 label 堆到底部或全局一条横排。
- tput label 必须短名展示，如 `uid0 rmnet_data5`、`uid10302 aweme`，完整 stream 信息放入 summary CSV。
- 此模板是窗口类 RSRP / ModemActivity / tput 联合分析的默认入口；除非用户明确要求单指标图，否则不要再手工拼装临时 HTML。

### 1. ModemActivityInfo 交互式图
```bash
python3 ${APLOG_PLOT_TOOL}/aplog_plot_modemactivityinfo.py \
  --input <modem_activity_info.csv|power_modem_activityinfo.txt> \
  --start-time "MM-DD HH:MM:SS" \
  --end-time "MM-DD HH:MM:SS"
```

输出：
- `<base>_quick_analysis.csv`
- `<base>_phone0_quick_analysis.png`
- `<base>_phone0_quick_analysis.html`

说明：
- 优先输入 `modem_activity_info.csv`，这是 AP filter 的结构化 SSOT。
- 脚本兼容 `power_modem_activityinfo.txt`，也兼容原始 `ModemActivityInfo{...}` 日志行。
- 睡眠率 / idle 率按真实区间宽度绘制，避免把几十毫秒的 0 值误画成长时间持续。

### 2. 按 UID 吞吐与流量 HTML 图
```bash
python3 ${APLOG_PLOT_TOOL}/aplog_plot_uid_tput.py \
  --input <data_net_netifstats.txt|data_net_uidstats.txt> \
  --start-time "MM-DD HH:MM:SS[.mmm]" \
  --end-time "MM-DD HH:MM:SS[.mmm]"
```

输出：
- `<base>_uid_tput_summary.csv`
- `<base>_uid_<uid>_tput.csv`
- `<base>_uid_<uid>_tput.html`

说明：
- 速率统一输出为 Mbps，换算口径为 `sendRate(Bps|recvRate(Bps)) * 8 / 1,000,000`。
- 流量统一输出为 MB，换算口径为相同 `uid + statSrcType + ifName + appPackageName` 统计流的 `totalSendBytes/totalRecvBytes` 正向差分 `/ 1,000,000`。
- `data_net_netifstats.txt` 的 `uid:0` 是接口级统计，不能把 `rmnet_data1/2/3/4/5/wlan0` 直接合并成一个 UID 总量；HTML 顶部 summary table 会按统计流分别展示。
- 同一行里存在多个 `L4NetEvaluate ... uid:` 片段时，必须逐段解析，不能只取行内第一个 UID。
- `Top 3 apps` 里的 Rank 只包含瞬时速率，没有 `totalSendBytes/totalRecvBytes`，不作为流量统计来源。

### 3. netifStats 整体吞吐 PNG 图
```bash
python3 ${APLOG_FILTER_TOOL}/additional_tool/aplog_plot_tput.py \
  --input <data_net_netifstats.txt> \
  --start-time "MM-DD HH:MM:SS" \
  --end-time "MM-DD HH:MM:SS"
```

### 4. 注册态 / 信号图
```bash
python3 ${APLOG_FILTER_TOOL}/additional_tool/plot_logcatAplog_reg_signal.py \
  --input-dir <filter_dir>
```

### 5. NetworkBrain serving cell HTML 时间轴
```bash
python3 ${APLOG_PLOT_TOOL}/aplog_plot_serving_cell.py \
  --input <reg_data_sub_serv_cell.txt> \
  --outdir <output_dir> \
  [--start-time "MM-DD HH:MM:SS[.mmm]"] \
  [--end-time "MM-DD HH:MM:SS[.mmm]"]
```

输出：
- `<base>_serving_cell_timeline.html`
- `<base>_serving_cell_timeline.csv`

说明：
- 横轴使用 AP log timestamp 的真实 date axis，初始范围覆盖过滤后的真实时间窗；不能把样本序号当作横轴，避免长间隔被压缩。
- 子图固定覆盖：`inService/isOos`、`ratType 4G/5G`、`RSRP by RAT`、`SNR by RAT`、`RSRQ by RAT`、`PCI`、`Band`、`freq`。
- `channelNumber` 保留在 CSV 和 hover 中；主图不与 `freq` 叠画，避免同值曲线互相遮挡。
- 图形类型按数据语义选择：`inService/isOos` 使用阶梯线；`ratType`、`PCI`、`Band`、`freq` 使用按真实时间宽度绘制的柱状图；`RSRP/SNR/RSRQ` 各自使用一张散点子图，并在子图内用颜色和 marker 区分 4G/5G，避免长时间无样本区间被折线误读为连续变化。
- HTML 布局必须按子图划分 panel 区域：子图标题、坐标轴、时间刻度和 legend 都放在对应 panel 内；panel 之间保留可见间隔，避免标题、坐标信息和 label 跨区域重叠。
- `2147483647`、`-1` 等无效哨兵值不作为有效数值绘制，但原始事件仍保留在解析 CSV 中便于追溯。

## 输出约定
- 当输入位于 `rootdir/runs/<timestamp>_v<version>/...` 下时，绘图产物默认与输入文件同目录输出。
- 如脚本支持 `--outdir`，优先使用显式输出目录。
- 动态 HTML 图优先保留 `rangeslider` / `rangeselector`，便于在页面内调整时间范围。

## 配合规则
- 过滤职责属于 `skill_log_filter_aplog`。
- 绘图职责属于 `skill_log_plot_aplog`。
- 当用户明确说“只过滤”“先出 section 文本”，停留在 `skill_log_filter_aplog`。
- 当用户明确说“画图”“生成 HTML/PNG”“动态调时间范围”，转到本技能。

## 说明
- 本技能默认消费 AP filter 产物，不直接替代 AP filter。
- 若发现 `<section>.txt` 缺失，先回到 `skill_log_filter_aplog` 补产物，再执行绘图。
