| 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() |
|
|