bci-mvp / src /check_data.py
WilliamK112
refactor: replace legacy MNE pick_types with modern raw.pick API
c219720
Raw
History Blame Contribute Delete
1.6 kB
from pathlib import Path
import numpy as np
import mne
def inspect_one_edf(edf_path: Path, epoch_sec=2.0, overlap=0.5):
info = {"file": edf_path.name, "ok": False, "error": "", "n_channels": 0, "sfreq": 0.0, "duration_sec": 0.0, "est_epochs": 0}
try:
raw = mne.io.read_raw_edf(str(edf_path), preload=False, verbose=False)
raw.pick(picks="eeg", exclude="bads")
sfreq = float(raw.info["sfreq"])
duration_sec = raw.n_times / sfreq if sfreq > 0 else 0.0
win = int(epoch_sec * sfreq)
step = int(win * (1 - overlap))
if step <= 0:
raise ValueError("Invalid overlap")
est_epochs = max(0, (raw.n_times - win) // step + 1)
info.update({"ok": True, "n_channels": len(raw.ch_names), "sfreq": sfreq, "duration_sec": duration_sec, "est_epochs": est_epochs})
except Exception as e:
info["error"] = f"{type(e).__name__}: {e}"
return info
def scan(folder):
edfs = sorted(Path(folder).glob("*.edf"))
return [inspect_one_edf(f) for f in edfs]
def main():
groups = {"relaxed": "data/relaxed", "focused": "data/focused"}
all_r = []
for name, path in groups.items():
rs = scan(path)
print(f"[{name}] files={len(rs)}")
for r in rs:
print(r)
all_r.extend(rs)
ok = [x for x in all_r if x["ok"]]
bad = [x for x in all_r if not x["ok"]]
print(f"Total={len(all_r)} Readable={len(ok)} Failed={len(bad)}")
if ok:
print("Median sfreq", float(np.median([x["sfreq"] for x in ok])))
if __name__ == "__main__":
main()