alterlab-imaging-data-commons — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-imaging-data-commons (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use the idc-index Python package to query and download public cancer imaging data from the National Cancer Institute Imaging Data Commons (IDC). No authentication required for data access.
Current IDC Data Version: v24 (always verify with IDCClient().get_idc_version())
Primary tool: idc-index (GitHub)
CRITICAL - Check package version and upgrade if needed (run this FIRST):
from importlib.metadata import version as _v
from packaging.version import Version
REQUIRED_VERSION = "0.12.3" # Must match metadata.idc-index in this file
installed = _v("idc-index")
# Compare as versions, not strings ("0.9.0" < "0.11.0" is False as a string).
if Version(installed) < Version(REQUIRED_VERSION):
print(f"idc-index {installed} is older than {REQUIRED_VERSION}; upgrade with:")
print(" pip install --upgrade idc-index # or: uv pip install --upgrade idc-index")
print("Then restart Python to load the new version.")
else:
print(f"idc-index {installed} meets requirement ({REQUIRED_VERSION})")Verify IDC data version and check current data scale:
from idc_index import IDCClient
client = IDCClient()
# Verify IDC data version (should be "v24")
print(f"IDC data version: {client.get_idc_version()}")
# Get collection count and total series
stats = client.sql_query("""
SELECT
COUNT(DISTINCT collection_id) as collections,
COUNT(DISTINCT analysis_result_id) as analysis_results,
COUNT(DISTINCT PatientID) as patients,
COUNT(DISTINCT StudyInstanceUID) as studies,
COUNT(DISTINCT SeriesInstanceUID) as series,
SUM(instanceCount) as instances,
SUM(series_size_MB)/1000000 as size_TB
FROM index
""")
print(stats)Core workflow:
client.sql_query()client.download_from_selection()client.get_viewer_URL(seriesInstanceUID=...)scripts/query_imaging_data_commons.py — CLI wrapper over the idc-index package (JSON to stdout; pip install --upgrade idc-index):
python scripts/query_imaging_data_commons.py version # IDC data version
python scripts/query_imaging_data_commons.py collections --limit 50 # collections + counts
python scripts/query_imaging_data_commons.py sql "SELECT * FROM index LIMIT 5" # raw SQLCore Sections (inline):
Reference Guides (load on demand):
| Guide | When to Load |
|---|---|
core_api_examples.md | Runnable code for Core Capabilities §1-§9 (discovery, SQL, download, visualize, license, batch, BigQuery, pipelines) |
index_tables_guide.md | Complex JOINs, schema discovery, DataFrame access |
use_cases.md | End-to-end workflow examples (training datasets, batch downloads) |
sql_patterns.md | Quick SQL patterns for filter discovery, annotations, size estimation |
clinical_data_guide.md | Clinical/tabular data, imaging+clinical joins, value mapping |
cloud_storage_guide.md | Direct S3/GCS access, versioning, UUID mapping |
dicomweb_guide.md | DICOMweb endpoints, PACS integration |
digital_pathology_guide.md | Slide microscopy (SM), annotations (ANN), pathology workflows |
bigquery_guide.md | Full DICOM metadata, private elements (requires GCP) |
cli_guide.md | Command-line tools (idc download, manifest files) |
IDC adds two grouping levels above the standard DICOM hierarchy (Patient → Study → Series → Instance):
tcga_luad, nlst). A patient belongs to exactly one collection.Use collection_id to find original imaging data, may include annotations deposited along with the images; use analysis_result_id to find AI-generated or expert annotations.
Key identifiers for queries:
| Identifier | Scope | Use for |
|---|---|---|
collection_id | Dataset grouping | Filtering by project/study |
PatientID | Patient | Grouping images by patient |
StudyInstanceUID | DICOM study | Grouping of related series, visualization |
SeriesInstanceUID | DICOM series | Grouping of related series, visualization |
The idc-index package provides multiple metadata index tables, accessible via SQL or as pandas DataFrames.
Complete index table documentation: Use https://idc-index.readthedocs.io/en/latest/indices_reference.html for quick check of available tables and columns without executing any code.
Important: Use client.indices_overview to get current table descriptions and column schemas. This is the authoritative source for available columns and their types — always query it when writing SQL or exploring data structure.
| Table | Row Granularity | Loaded | Description |
|---|---|---|---|
index | 1 row = 1 DICOM series | Auto | Primary metadata for all current IDC data |
prior_versions_index | 1 row = 1 DICOM series | Auto | Series from previous IDC releases; for downloading deprecated data |
collections_index | 1 row = 1 collection | fetch_index() | Collection-level metadata and descriptions |
analysis_results_index | 1 row = 1 analysis result collection | fetch_index() | Metadata about derived datasets (annotations, segmentations) |
clinical_index | 1 row = 1 clinical data column | fetch_index() | Dictionary mapping clinical table columns to collections |
sm_index | 1 row = 1 slide microscopy series | fetch_index() | Slide Microscopy (pathology) series metadata |
sm_instance_index | 1 row = 1 slide microscopy instance | fetch_index() | Instance-level (SOPInstanceUID) metadata for slide microscopy |
seg_index | 1 row = 1 DICOM Segmentation series | fetch_index() | Segmentation metadata: algorithm, segment count, reference to source image series |
ann_index | 1 row = 1 DICOM ANN series | fetch_index() | Microscopy Bulk Simple Annotations series metadata; references annotated image series |
ann_group_index | 1 row = 1 annotation group | fetch_index() | Detailed annotation group metadata: graphic type, annotation count, property codes, algorithm |
contrast_index | 1 row = 1 series with contrast info | fetch_index() | Contrast agent metadata: agent name, ingredient, administration route (CT, MR, PT, XA, RF) |
Auto = loaded automatically when IDCClient() is instantiated fetch_index() = requires client.fetch_index("table_name") to load
Key columns are not explicitly labeled, the following is a subset that can be used in joins.
| Join Column | Tables | Use Case |
|---|---|---|
collection_id | index, prior_versions_index, collections_index, clinical_index | Link series to collection metadata or clinical data |
SeriesInstanceUID | index, prior_versions_index, sm_index, sm_instance_index | Link series across tables; connect to slide microscopy details |
StudyInstanceUID | index, prior_versions_index | Link studies across current and historical data |
PatientID | index, prior_versions_index | Link patients across current and historical data |
analysis_result_id | index, analysis_results_index | Link series to analysis result metadata (annotations, segmentations) |
source_DOI | index, analysis_results_index | Link by publication DOI |
crdc_series_uuid | index, prior_versions_index | Link by CRDC unique identifier |
Modality | index, prior_versions_index | Filter by imaging modality |
SeriesInstanceUID | index, seg_index, ann_index, ann_group_index, contrast_index | Link segmentation/annotation/contrast series to its index metadata |
segmented_SeriesInstanceUID | seg_index → index | Link segmentation to its source image series (join seg_index.segmented_SeriesInstanceUID = index.SeriesInstanceUID) |
referenced_SeriesInstanceUID | ann_index → index | Link annotation to its source image series (join ann_index.referenced_SeriesInstanceUID = index.SeriesInstanceUID) |
Note: Subjects, Updated, and Description appear in multiple tables but have different meanings (counts vs identifiers, different update contexts).
For detailed join examples, schema discovery patterns, key columns reference, and DataFrame access, see references/index_tables_guide.md.
# Fetch clinical index (also downloads clinical data tables)
client.fetch_index("clinical_index")
# Query clinical index to find available tables and their columns
tables = client.sql_query("SELECT DISTINCT table_name, column_label FROM clinical_index")
# Load a specific clinical table as DataFrame
clinical_df = client.get_clinical_table("table_name")See references/clinical_data_guide.md for detailed workflows including value mapping patterns and joining clinical data with imaging.
| Method | Auth Required | Best For |
|---|---|---|
idc-index | No | Key queries and downloads (recommended) |
| IDC Portal | No | Interactive exploration, manual selection, browser-based download |
| BigQuery | Yes (GCP account) | Complex queries, full DICOM metadata |
| DICOMweb proxy | No | Tool integration via DICOMweb API |
| Cloud storage (S3/GCS) | No | Direct file access, bulk downloads, custom pipelines |
Cloud storage organization
IDC maintains all DICOM files in public cloud storage buckets mirrored between AWS S3 and Google Cloud Storage. Files are organized by CRDC UUIDs (not DICOM UIDs) to support versioning.
| Bucket (AWS / GCS) | License | Content |
|---|---|---|
idc-open-data / idc-open-data | No commercial restriction | >90% of IDC data |
idc-open-data-two / idc-open-idc1 | No commercial restriction | Collections with potential head scans |
idc-open-data-cr / idc-open-cr | Commercial use restricted (CC BY-NC) | ~4% of data |
Files are stored as <crdc_series_uuid>/<crdc_instance_uuid>.dcm. Access is free (no egress fees) via AWS CLI, gsutil, or s5cmd with anonymous access. Use series_aws_url column from the index for S3 URLs; GCS uses the same path structure.
See references/cloud_storage_guide.md for bucket details, access commands, UUID mapping, and versioning.
DICOMweb access
IDC data is available via DICOMweb interface (Google Cloud Healthcare API implementation) for integration with PACS systems and DICOMweb-compatible tools.
| Endpoint | Auth | Use Case |
|---|---|---|
| Public proxy | No | Testing, moderate queries, daily quota |
| Google Healthcare | Yes (GCP) | Production use, higher quotas |
See references/dicomweb_guide.md for endpoint URLs, code examples, supported operations, and implementation details.
Required (for basic access):
pip install --upgrade idc-indexImportant: New IDC data release will always trigger a new version of idc-index. Always use --upgrade flag while installing, unless an older version is needed for reproducibility.
IMPORTANT: IDC data version v24 is current. Always verify your version:
print(client.get_idc_version()) # Should return "v24"If you see an older version, upgrade with: pip install --upgrade idc-index
Tested with: idc-index 0.12.3 (IDC data version v24)
Optional (for data analysis):
pip install pandas numpy pydicomRunnable Python/SQL/CLI recipes for every capability below live in references/core_api_examples.md (numbered §1-§9 matching the headings here). Load that file when you need copy-paste code; the summaries here give the routing and the key decisions. All examples assume from idc_index import IDCClient; client = IDCClient().
Find available collections and derived datasets:
index (patients/series/size per collection_id).collections_index (after fetch_index) gives curated per-collection metadata(CancerTypes, TumorLocations, Species, Subjects) without aggregating.
analysis_results_index lists derived datasets (AI segmentations, expertannotations, radiomics) with source collections and modalities.
Recipes in core_api_examples.md §1.
Two-step pattern: explore filter values first (SELECT DISTINCT Modality …, BodyPartExamined …), then query with validated values. Access results as a pandas DataFrame. To filter by cancer type, JOIN index with collections_index (cancer type lives in collections_index.CancerTypes, not the primary index). Use client.indices_overview for the full column list. Recipes in core_api_examples.md §2.
client.download_from_selection(...) by collection_id or seriesInstanceUID, with downloadDir and an optional dirTemplate (default %collection_id/%PatientID/%StudyInstanceUID/%Modality_%SeriesInstanceUID; "" for a flat layout). Files are named by CRDC instance UUID (<uuid>.dcm), not DICOM UID. The idc download CLI mirrors this and auto-detects identifiers vs manifest files. Recipes, CLI options, and manifest format in core_api_examples.md §3; deeper CLI detail in references/cli_guide.md.
client.get_viewer_URL(seriesInstanceUID=...) (or studyInstanceUID=... for multi-series exams) returns a browser URL — no download needed. The method picks OHIF v3 for radiology or SLIM for slide microscopy automatically. Recipe in core_api_examples.md §4.
Query license_short_name before any use. CC BY 4.0/3.0 (~97%) allows commercial use with attribution; CC BY-NC 4.0/3.0 (~3%) is non-commercial only; rare custom licenses exist. For attribution, citations_from_selection() generates formatted citations from source_DOI (APA default; also BibTeX, JSON, Turtle via IDCClient.CITATION_FORMAT_*). Recipes in core_api_examples.md §5.
Query with filters → save a manifest CSV → download in batches (e.g. 10 series at a time) to avoid timeouts. Recipe in core_api_examples.md §6.
Use BigQuery only when you need full DICOM metadata, complex JOINs, or private DICOM elements (OtherElements). First check whether a specialized index (seg_index, ann_index/ann_group_index, sm_index, collections_index) already has the field — local sql_query is free and needs no GCP account. Dataset bigquery-public-data.idc_current.*, main table dicom_all. See references/bigquery_guide.md; quick reference in core_api_examples.md §7.
| Task | Tool | Reference |
|---|---|---|
| Programmatic queries & downloads | idc-index | This document |
| Interactive exploration | IDC Portal | https://portal.imaging.datacommons.cancer.gov/ |
| Complex metadata queries | BigQuery | references/bigquery_guide.md |
| 3D visualization & analysis | SlicerIDCBrowser | https://github.com/ImagingDataCommons/SlicerIDCBrowser |
Default choice: Use idc-index for most tasks (no auth, easy API, batch downloads).
After download, read DICOM with pydicom, build 3D volumes by sorting on ImagePositionPatient[2] and stacking pixel_array, or read a series with SimpleITK.ImageSeriesReader for processing and NIfTI export. Recipes in core_api_examples.md §9.
See references/use_cases.md for complete end-to-end workflow examples including:
client.get_idc_version() at the start of a session to confirm you're using the expected data version (currently v24). If using an older version, recommend pip install --upgrade idc-indexlicense_short_name field and respect licensing terms (CC BY vs CC BY-NC)citations_from_selection() to get properly formatted citations from source_DOI values; include these in publicationsLIMIT clause when exploring to avoid long downloads and understand data structure%collection_id/%PatientID/%ModalityIssue: `ModuleNotFoundError: No module named 'idc_index'`
pip install --upgrade idc-indexIssue: Download fails with connection timeout
dirTemplate to organize downloads by batchIssue: `BigQuery quota exceeded` or billing errors
references/bigquery_guide.md for cost optimization tipsIssue: Series UID not found or no data returned
LIMIT 5 to test query firstIssue: Downloaded DICOM files won't open
pydicom.dcmread(file, force=True)See references/sql_patterns.md for quick-reference SQL patterns including:
For segmentation and annotation details, also see references/digital_pathology_guide.md.
The following skills complement IDC workflows for downstream analysis and visualization:
See references/digital_pathology_guide.md for DICOM-compatible tools (highdicom, wsidicom, TIA-Toolbox, Slim viewer).
Always use `client.indices_overview` for current column schemas. This ensures accuracy with the installed idc-index version:
# Get all column names and types for any table
schema = client.indices_overview["index"]["schema"]
columns = [(c['name'], c['type'], c.get('description', '')) for c in schema['columns']]See the Quick Navigation section at the top for the full list of reference guides with decision triggers.
This skill version is available in skill metadata. To check for updates:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.