Source code for pyavs.io.config_io

"""
Configuration I/O utilities for loading configs from saved population codes.
"""

import os
import json
from pathlib import Path
from typing import Optional, Union

from ..config import ConfigManager, load_config


[docs] def load_config_from_population_codes( data_path: str, parameter_signature: str ) -> Optional[ConfigManager]: """ Load the configuration that was used to generate population codes. Parameters ---------- data_path : str Path to the dataset parameter_signature : str Parameter signature of the population codes Returns ------- ConfigManager or None Configuration manager if found, None otherwise """ param_dir = os.path.join(data_path, 'derivatives', 'pyavs', 'population_codes', parameter_signature) config_file = os.path.join(param_dir, 'config.json') if os.path.exists(config_file): return load_config(config_file) return None
[docs] def find_configs_for_subject( data_path: str, subject_id: int ) -> dict: """ Find all configuration files for a given subject. Parameters ---------- data_path : str Path to the dataset subject_id : int Subject ID Returns ------- dict Dictionary mapping parameter signatures to config file paths """ derivatives_dir = os.path.join(data_path, 'derivatives', 'pyavs', 'population_codes') if not os.path.exists(derivatives_dir): return {} configs = {} subject_group = f"sub{((subject_id - 1) // 5) * 5 + 1:02d}-{min(((subject_id - 1) // 5 + 1) * 5, 99):02d}" # Search through parameter signature directories for param_sig in os.listdir(derivatives_dir): param_dir = os.path.join(derivatives_dir, param_sig) if not os.path.isdir(param_dir): continue # Check if this parameter set has data for our subject subject_dir = os.path.join(param_dir, subject_group) if not os.path.exists(subject_dir): continue # Check for config file config_file = os.path.join(param_dir, 'config.json') if os.path.exists(config_file): configs[param_sig] = config_file return configs
[docs] def list_available_configs(data_path: str) -> dict: """ List all available configurations in the derivatives directory. Parameters ---------- data_path : str Path to the dataset Returns ------- dict Dictionary with parameter signatures as keys and config info as values """ derivatives_dir = os.path.join(data_path, 'derivatives', 'pyavs', 'population_codes') if not os.path.exists(derivatives_dir): return {} configs = {} for param_sig in os.listdir(derivatives_dir): param_dir = os.path.join(derivatives_dir, param_sig) if not os.path.isdir(param_dir): continue config_file = os.path.join(param_dir, 'config.json') if os.path.exists(config_file): try: # Load basic info about the config with open(config_file, 'r') as f: config_data = json.load(f) # Extract key information analysis = config_data.get('analysis', {}) processing = config_data.get('processing', {}) info = { 'config_file': config_file, 'event_type': analysis.get('event_type', 'unknown'), 'subject_id': analysis.get('subject_id', 'unknown'), 'sessions': analysis.get('sessions', []), 'sampling_rate': processing.get('resample_freq', 'unknown'), 'method': analysis.get('method', 'unknown'), 'rois': analysis.get('rois', []), 'parameter_signature': param_sig } configs[param_sig] = info except Exception as e: # Skip configs that can't be loaded continue return configs
[docs] def reproduce_analysis_from_config( config_file: Union[str, Path], subject_id: Optional[int] = None, sessions: Optional[list] = None ) -> ConfigManager: """ Load a configuration and optionally override subject/session parameters. This is useful for reproducing an analysis with the same parameters but for different subjects or sessions. Parameters ---------- config_file : str or Path Path to configuration file subject_id : int, optional Override subject ID sessions : list, optional Override sessions Returns ------- ConfigManager Configuration ready for analysis """ config = load_config(config_file) if subject_id is not None: config.analysis.subject_id = subject_id if sessions is not None: config.analysis.sessions = sessions # Validate the modified configuration config.validate() return config