{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":99552,"databundleVersionId":13190393,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import csv, multiprocessing as mp\nfrom pathlib import Path\nfrom functools import partial\nimport pydicom\nfrom tqdm import tqdm\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T17:43:08.078252Z","iopub.execute_input":"2025-08-03T17:43:08.078549Z","iopub.status.idle":"2025-08-03T17:43:08.783132Z","shell.execute_reply.started":"2025-08-03T17:43:08.078524Z","shell.execute_reply":"2025-08-03T17:43:08.782099Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# ---------- configuration ----------\nSOURCE_DIR = Path(\"/kaggle/input/rsna-intracranial-aneurysm-detection/series\")   # 4405 dir\nLOG_DIR    = Path(\"/kaggle/working/logs\"); LOG_DIR.mkdir(parents=True, exist_ok=True)\nCSV_OUT    = LOG_DIR / \"dim_mismatch.csv\"\nN_WORKERS  = max(mp.cpu_count(), 2)\n# -----------------------------------\n\ndef inspect_series(dir_path: Path):\n    rows, cols = set(), set()\n    dcm_files = sorted(dir_path.glob(\"*.dcm\"))\n    if not dcm_files:\n        return (dir_path.name, \"no_dcm_files\", \"\", \"\", 0)\n\n    try:\n        for f in dcm_files:\n            ds = pydicom.dcmread(str(f), stop_before_pixels=True, force=True)\n            rows.add(int(ds.Rows))\n            cols.add(int(ds.Columns))\n            \n            if len(rows) > 1 or len(cols) > 1:\n                break\n    except Exception as e:\n        return (dir_path.name, f\"read_error:{e.__class__.__name__}\", \"\", \"\", 0)\n\n    if len(rows) == 1 and len(cols) == 1:\n        return None                      \n\n    return (\n        dir_path.name,\n        \";\".join(map(str, rows)),\n        \";\".join(map(str, cols)),\n        len(dcm_files),\n        \"mismatch\"\n    )\n\ndef main():\n    series_dirs = [p for p in SOURCE_DIR.iterdir() if p.is_dir()]\n    fieldnames = [\"SeriesDir\", \"RowsSet\", \"ColsSet\", \"n_files\", \"note\"]\n\n    with mp.Pool(N_WORKERS) as pool, CSV_OUT.open(\"w\", newline=\"\") as csvfile:\n        writer = csv.writer(csvfile); writer.writerow(fieldnames)\n        for res in tqdm(pool.imap_unordered(inspect_series, series_dirs),\n                        total=len(series_dirs), desc=\"Scanning\"):\n            if res is not None:\n                writer.writerow(res)\n\n    print(f\"✔ Проверка завершена. Лог только проблемных серий → {CSV_OUT}\")\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T18:20:55.084825Z","iopub.execute_input":"2025-08-03T18:20:55.085192Z","iopub.status.idle":"2025-08-03T18:52:17.763026Z","shell.execute_reply.started":"2025-08-03T18:20:55.085125Z","shell.execute_reply":"2025-08-03T18:52:17.760396Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\ndf = pd.read_csv(\"/kaggle/working/logs/dim_mismatch.csv\")\n\n\nprint(\"Всего серий с несоответствием:\", df.shape[0])\nprint(df.head())        \n\ndf  \n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-03T18:58:46.633548Z","iopub.execute_input":"2025-08-03T18:58:46.63449Z","iopub.status.idle":"2025-08-03T18:58:46.694602Z","shell.execute_reply.started":"2025-08-03T18:58:46.634457Z","shell.execute_reply":"2025-08-03T18:58:46.693323Z"}},"outputs":[],"execution_count":null}]}