75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
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)
|