{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","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":13851420,"sourceType":"competition"}],"dockerImageVersionId":31234,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# CELL 1: Install (then restart kernel)\n!pip install \"numpy<2\" -q\n!pip install pydicom pylibjpeg pylibjpeg-libjpeg pylibjpeg-openjpeg -q\nprint(\"✓ Done. Now restart kernel: Runtime → Restart session\")\n\n# CELL 2: Extract all metadata (run after restart)\nimport pydicom\nimport pandas as pd\nfrom pathlib import Path\nimport warnings\nimport time\nwarnings.filterwarnings('ignore')\n\n# Load and filter CTA\ndf = pd.read_csv('/kaggle/input/rsna-intracranial-aneurysm-detection/train.csv')\ncta_df = df[df['Modality'] == 'CTA']\nprint(f\"Total CTA series: {len(cta_df)}\")\n\nINPUT_DIR = '/kaggle/input/rsna-intracranial-aneurysm-detection/series'\n\nall_metadata = []\nstart_time = time.time()\n\nfor series_idx, (_, row) in enumerate(cta_df.iterrows()):\n    series_uid = row['SeriesInstanceUID']\n    dcm_files = list(Path(INPUT_DIR, series_uid).glob('*.dcm'))\n    \n    if len(dcm_files) == 0:\n        continue\n    \n    for dcm_file in dcm_files:\n        try:\n            ds = pydicom.dcmread(str(dcm_file))\n            \n            meta = row.to_dict()\n            meta['DICOMFileName'] = dcm_file.name\n            meta['NumberOfSlicesInSeries'] = len(dcm_files)\n            \n            for elem in ds:\n                if elem.tag == (0x7fe0, 0x0010):\n                    continue\n                tag_name = elem.keyword if elem.keyword else f\"Tag_{elem.tag}\"\n                try:\n                    value = elem.value\n                    if isinstance(value, bytes):\n                        value = 'bytes'\n                    elif isinstance(value, pydicom.sequence.Sequence):\n                        value = f'Sequence({len(value)})'\n                    else:\n                        value = str(value)\n                except:\n                    value = None\n                meta[tag_name] = value\n            \n            all_metadata.append(meta)\n        except:\n            continue\n    \n    if (series_idx + 1) % 50 == 0:\n        elapsed = time.time() - start_time\n        remaining = (len(cta_df) - series_idx - 1) / ((series_idx + 1) / elapsed) / 60\n        print(f\"{series_idx + 1}/{len(cta_df)} series | {len(all_metadata)} files | ~{remaining:.1f} min left\")\n\n# Save\nmetadata_df = pd.DataFrame(all_metadata)\nmetadata_df.to_csv('/kaggle/working/cta_all_sop_metadata.csv', index=False)\n\nprint(f\"\\n✓ Saved: cta_all_sop_metadata.csv\")\nprint(f\"  Rows: {len(metadata_df)}\")\nprint(f\"  Columns: {len(metadata_df.columns)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-08T06:22:08.623363Z","iopub.execute_input":"2026-01-08T06:22:08.62427Z","execution_failed":"2026-01-08T06:34:42.119Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print('Done')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T12:43:53.877645Z","iopub.execute_input":"2026-01-07T12:43:53.878047Z","iopub.status.idle":"2026-01-07T12:43:53.88354Z","shell.execute_reply.started":"2026-01-07T12:43:53.878013Z","shell.execute_reply":"2026-01-07T12:43:53.882667Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}