import os import re from pathlib import Path # 1. DYNAMIC ANCHOR - Works on ANY machine HOME_DIR = Path.home() # 2. MAIN DIRECTORIES SOURCE_CODE_DIR = HOME_DIR / "Speckle-Scanner" RAW_DATA_DIR = HOME_DIR / "3D-Scans" CALIB_DATA_DIR = HOME_DIR / "Calib-data" PROCESSING_DIR = HOME_DIR / "Speckle-Scanner_Processing_data" # 3. HELPER FUNCTIONS FOR DYNAMIC PATHING def get_raw_dir(project, date_str, session, scan): """Path to original untouched data.""" return RAW_DATA_DIR / project / date_str / session / scan def get_calib_dir(project, date_str, calib_number): """Path to camera calibration data.""" return CALIB_DATA_DIR / project / date_str / calib_number def get_processing_step_dir(project, date_str, session, scan, step_folder_name): """ Path for sequential pipeline steps (e.g., '01_raw_images', '02_rect_images'). Automatically creates the folder if it does not exist. """ path = PROCESSING_DIR / project / date_str / session / scan / step_folder_name path.mkdir(parents=True, exist_ok=True) return path def get_session_processing_dir(project, date_str, session): """Path to one processing session directory.""" path = PROCESSING_DIR / project / date_str / session path.mkdir(parents=True, exist_ok=True) return path def get_params_link_dir(project, date_str, session): """Path to shared params_link folder for one session.""" return get_session_processing_dir(project, date_str, session) / "params_link" def list_session_dirs(project, date_str): """Return sorted session folder names under a project/date.""" date_dir = PROCESSING_DIR / project / date_str if not date_dir.exists(): return [] sessions = [ p.name for p in date_dir.iterdir() if p.is_dir() and "session" in p.name.lower() ] def session_sort_key(name): m = re.search(r'\d+', name) return int(m.group()) if m else 0 return sorted(sessions, key=session_sort_key) def list_scan_dirs(project, date_str, session): """Return sorted scan folder names (handles 'Scan000001' and 'scan-1' patterns).""" session_dir = get_session_processing_dir(project, date_str, session) scans = [ p.name for p in session_dir.iterdir() if p.is_dir() and (p.name.startswith("Scan") or p.name.startswith("scan-")) ] def scan_sort_key(name): m = re.search(r'\d+', name) return int(m.group()) if m else 0 return sorted(scans, key=scan_sort_key)