# `thresholds/scanner.py` 設計概要

## 🎯 モジュールの目的

- スレッショルドスキャン処理を担う。
- 各チャネルに対して指定された範囲のしきい値を順に適用し、一定時間のヒット数を測定する。

---

## 🧩 実装すべき関数一覧

### 1. scan_channel

- 単一チャネルに対してスキャンを実行する。
- `SensorConfig.threshold_range()` に従ってループし、各しきい値でヒット数を測定する。
- 戻り値は `(threshold, count)` のタプルのリスト。

### 2. scan_all_channels_serial

- 各チャネルを順番にスキャンする。
- スキャン対象以外のチャネルはマスク（例：しきい値500）される。
- 全チャネル分の結果を辞書形式で返す。

### 3. scan_all_channels_parallel

- 各チャネルに対してスレッショルドを逐次設定した後、並列でスキャンを実行する。
- スレッドなどを用いて時間短縮を狙う。
- 実行にはデバイスの動作特性に注意が必要。

### 4. save_scan_data

- スキャン結果をCSVまたはJSONでファイル保存する。
- CLIの `--out` オプションで出力先を指定できる設計を想定。

### 5. load_scan_data

- スキャン結果をCSVまたはJSONから読み込み、後段の `fitter` などで再利用可能にする。

---

## 🔧 内部補助関数（必要に応じて）

- `set_threshold`: 特定のチャネルにしきい値を設定する。
- `count_hits`: 一定時間のヒット数を測定する。

---

## 🧱 使用するデータモデル：SensorConfig

- `label`: チャネル名（"top", "mid", "btm" など）
- `start_threshold`: スキャン開始のしきい値
- `num_steps`: ステップ数（測定点数）
- `step_size`: スレッショルド値のステップ幅
- `threshold`: 最終的に設定されるしきい値（Optional）

補助メソッドとして `threshold_range()` を持ち、`range(start, stop, step)` を返す。

---

## ⚙ スキャンモードの切替（CLI想定）

- `serial`: マスク付きで1チャネルずつスキャン（デフォルト、安全）
- `parallel`: 全チャネルにスレッショルドを設定後、並列にカウント測定（高速化）

CLI側では `--mode serial` または `--mode parallel` のように切り替え可能とする設計。

---

## 📁 モジュール構成例（一覧）

- `scan_channel`
- `scan_all_channels_serial`
- `scan_all_channels_parallel`
- `save_scan_data`
- `load_scan_data`
- `set_threshold`（補助）
- `count_hits`（補助）
