daq/sampler.py 設計検討まとめ#
実装した関数#
class Sampler(device: Device, config: DeviceConfig)read_event() -> RawEventcount_based_iterator(num_events) -> inttime_based_iterator(duration) -> Noneacquire_by_count(iterator) -> list[RawEvent]acquire_by_time(iterator) -> list[RawEvent]stream_events -> Iterator[RawEvent]collect_events -> list[RawEvent]save_eventsto_csv(events: list[RawEvent], path: Path) -> bool
✅ 追加検討中の関数案#
関数名 |
説明 |
|---|---|
|
DAQやSCAN設定に従ってイベントを収集・ファイル出力する |
|
|
|
進捗表示つきイテレーターに変換 |
|
モックデータの |
✅ run_session() の引数方針について#
検討された選択肢#
案 |
内容 |
評価 |
|---|---|---|
|
DAQ/SCAN共通の設定クラスを作成 |
将来的には有効だが、現段階では未導入なので採用見送り |
|
すでに定義されており、設定と一致している |
✅ 採用方針 |
|
両方の型を受け取れるようにする |
オプションとして検討可 |
|
共通プロパティをもつ型を明示 |
後からの拡張として有効 |
RunConfigのサンプル#
from pydantic import BaseModel
from pathlib import Path
class RunConfig(BaseModel):
output_dir: Path
events_per_file: int = 1000
events_per_run: int = 10000
prefix: str = "osechi_data"
use_progress: bool = True # オプション
DaqConfigとScanConfigで代用できるので採用しない
Protocolのサンプル#
from typing import Protocol
class RunLikeConfig(Protocol):
filename_prefix: str
events_per_file: int
events_per_run: int
def run_session(device: serial.Serial, config: RunLikeConfig, output_dir: Path) -> None:
...
DaqConfig,ScanConfigのどちらもRunLikeConfigとみなされる(構造的部分型)明示的に共通項目を示すことで、後からの拡張やIDE補完がスムーズ
テストやユーティリティ関数の引数型を簡潔に記述できる
✅ 採用する関数シグネチャ(暫定)#
run_session(device: serial.Serial, config: Union[DaqConfig, ScanConfig], output_dir: Path) -> None
from typing import Union
from pathlib import Path
import serial
def run_session(
device: serial.Serial,
config: Union[DaqConfig, ScanConfig],
output_dir: Path,
) -> None:
"""DAQまたはスキャン設定に従って、イベントを取得しファイルに保存する"""
✅ まとめ#
run_sessionはDaqConfig/ScanConfigをそのまま受け取る構成でOK。output_dirは TOML外部で決定するため、引数として分離。今後共通化したくなったら
RunLikeConfigのようなProtocolで対応可能。他にも
parse_line,sanitize,tqdm_wrapperなどのユーティリティが有用。