143 lines
3.8 KiB
Python
143 lines
3.8 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""
|
||
|
|
配置管理模块
|
||
|
|
"""
|
||
|
|
|
||
|
|
import yaml
|
||
|
|
from pathlib import Path
|
||
|
|
|
||
|
|
DEFAULT_CONFIG_YAML = """
|
||
|
|
simulation:
|
||
|
|
num_events: 8 # 生成的事件数量
|
||
|
|
output_file: "detector_output" # 去掉扩展名,会根据格式自动添加
|
||
|
|
output_format: "all" # 可选: binary, text, debug, all
|
||
|
|
packing_mode: "separate" # 打包模式: separate(单独打包), combined(整体打包)
|
||
|
|
event_generation_mode: "pulse" # 事件生成模式: random(随机), fixed(固定), pulse(脉冲)
|
||
|
|
|
||
|
|
detectors:
|
||
|
|
detector1:
|
||
|
|
name: "detector1"
|
||
|
|
sample_space_size: 5000
|
||
|
|
allow_replacement: true
|
||
|
|
energy_distribution:
|
||
|
|
type: "normal"
|
||
|
|
mean: 1000.0
|
||
|
|
std: 200.0
|
||
|
|
timestamp_distribution:
|
||
|
|
type: "exponential"
|
||
|
|
scale: 50.0
|
||
|
|
|
||
|
|
detector2:
|
||
|
|
name: "detector2"
|
||
|
|
sample_space_size: 4000
|
||
|
|
allow_replacement: true
|
||
|
|
energy_distribution:
|
||
|
|
type: "normal"
|
||
|
|
mean: 800.0
|
||
|
|
std: 150.0
|
||
|
|
timestamp_distribution:
|
||
|
|
type: "uniform"
|
||
|
|
low: 0.0
|
||
|
|
high: 200.0
|
||
|
|
|
||
|
|
detector3:
|
||
|
|
name: "detector3"
|
||
|
|
sample_space_size: 6000
|
||
|
|
allow_replacement: true
|
||
|
|
energy_distribution:
|
||
|
|
type: "gamma"
|
||
|
|
shape: 2.0
|
||
|
|
scale: 500.0
|
||
|
|
timestamp_distribution:
|
||
|
|
type: "normal"
|
||
|
|
mean: 100.0
|
||
|
|
std: 30.0
|
||
|
|
|
||
|
|
sampling:
|
||
|
|
min_signals_per_detector: 1 # 每个探测器最少信号数(随机模式使用)
|
||
|
|
max_signals_per_detector: 10 # 每个探测器最多信号数(随机模式使用)
|
||
|
|
require_signal: true
|
||
|
|
|
||
|
|
# 固定事件模式配置
|
||
|
|
fixed_events:
|
||
|
|
num_signals_per_event: 5 # 每个事件的信号数量
|
||
|
|
energy_levels: # 各探测器能量水平 (keV)
|
||
|
|
detector1: [1000, 2000, 3000, 4000, 5000]
|
||
|
|
detector2: [800, 1600, 2400, 3200, 4000]
|
||
|
|
detector3: [500, 1000, 1500, 2000, 2500]
|
||
|
|
timestamps: [10, 50, 100, 200, 300] # 时间戳序列 (us)
|
||
|
|
repeat_pattern: true # 是否重复使用模式
|
||
|
|
|
||
|
|
# 脉冲信号模式配置
|
||
|
|
pulse_signals:
|
||
|
|
pulse_count: 100 # 脉冲数量
|
||
|
|
pulse_interval: 2 # 脉冲间隔 (us)
|
||
|
|
pulse_width: 1 # 脉冲宽度 (信号数量)
|
||
|
|
energy_levels: # 各探测器能量水平 (keV)
|
||
|
|
detector1: 1500
|
||
|
|
detector2: 1200
|
||
|
|
detector3: 900
|
||
|
|
jitter: 0 # 时间抖动 (us)
|
||
|
|
energy_noise: 0 # 能量噪声 (keV)
|
||
|
|
|
||
|
|
# 硬件配置
|
||
|
|
hardware:
|
||
|
|
ip: "192.168.1.100"
|
||
|
|
port: 8080
|
||
|
|
data_source: "generated"
|
||
|
|
send_mode: "single"
|
||
|
|
loop_count: 1
|
||
|
|
interval: 100
|
||
|
|
"""
|
||
|
|
|
||
|
|
class ConfigManager:
|
||
|
|
"""配置管理器"""
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def load_config(config_file: str = None) -> dict:
|
||
|
|
"""
|
||
|
|
加载配置
|
||
|
|
|
||
|
|
参数:
|
||
|
|
config_file: 配置文件路径
|
||
|
|
|
||
|
|
返回:
|
||
|
|
配置字典
|
||
|
|
"""
|
||
|
|
if config_file and Path(config_file).exists():
|
||
|
|
with open(config_file, 'r', encoding='utf-8') as f:
|
||
|
|
return yaml.safe_load(f)
|
||
|
|
else:
|
||
|
|
# 使用默认配置
|
||
|
|
return yaml.safe_load(DEFAULT_CONFIG_YAML)
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def save_config(config: dict, config_file: str) -> bool:
|
||
|
|
"""
|
||
|
|
保存配置
|
||
|
|
|
||
|
|
参数:
|
||
|
|
config: 配置字典
|
||
|
|
config_file: 配置文件路径
|
||
|
|
|
||
|
|
返回:
|
||
|
|
是否保存成功
|
||
|
|
"""
|
||
|
|
try:
|
||
|
|
with open(config_file, 'w', encoding='utf-8') as f:
|
||
|
|
yaml.dump(config, f, default_flow_style=False, allow_unicode=True)
|
||
|
|
return True
|
||
|
|
except Exception as e:
|
||
|
|
print(f"保存配置失败: {e}")
|
||
|
|
return False
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def get_default_config() -> dict:
|
||
|
|
"""
|
||
|
|
获取默认配置
|
||
|
|
|
||
|
|
返回:
|
||
|
|
默认配置字典
|
||
|
|
"""
|
||
|
|
return yaml.safe_load(DEFAULT_CONFIG_YAML)
|