Skill Tracer
Skills › Scientific Agent Skills › imaging-data-commons › cloud_storage_guide.md

cloud_storage_guide.md

344 lines · skills/imaging-data-commons/references/cloud_storage_guide.md at 5f2bc03

Open on GitHub
1# Cloud Storage Guide for IDC
2
3IDC maintains all DICOM files in public cloud storage buckets mirrored between Google Cloud Storage (GCS) and AWS S3. This guide covers bucket organization, file structure, access methods, and versioning.
4

Cloud Storage Guide for IDC

IDC maintains all DICOM files in public cloud storage buckets mirrored between Google Cloud Storage (GCS) and AWS S3. This guide covers bucket organization, file structure, access methods, and versioning.

Raw lines 1 to 4
5## When to Use Direct Cloud Storage Access
6
7Use direct bucket access when you need:
8- Maximum download performance with parallel transfers
9- Integration with cloud-native workflows (e.g., running analysis on cloud VMs)
10- Programmatic access from tools like s5cmd or gsutil
11- Access to specific file versions for reproducibility
13For most use cases, `idc-index` is simpler and recommended -— it uses s5cmd internally to download from these same S3 buckets, handling the UUID lookups automatically. Use direct cloud storage when you need raw file access, custom parallelization, or are building cloud-native pipelines.

When to Use Direct Cloud Storage Access

Use direct bucket access when you need:

  • Maximum download performance with parallel transfers
  • Integration with cloud-native workflows (e.g., running analysis on cloud VMs)
  • Programmatic access from tools like s5cmd or gsutil
  • Access to specific file versions for reproducibility

For most use cases, idc-index is simpler and recommended -— it uses s5cmd internally to download from these same S3 buckets, handling the UUID lookups automatically. Use direct cloud storage when you need raw file access, custom parallelization, or are building cloud-native pipelines.

Raw lines 5 to 14
15## Storage Buckets
17IDC organizes data across multiple buckets based on licensing and content type. All buckets are mirrored between AWS and GCS with identical content and file paths.

Storage Buckets

IDC organizes data across multiple buckets based on licensing and content type. All buckets are mirrored between AWS and GCS with identical content and file paths.

Raw lines 15 to 18
19### Bucket Summary
21| Purpose | AWS S3 Bucket | GCS Bucket | License | Content |
22|---------|---------------|------------|---------|---------|
23| Primary data | `idc-open-data` | `idc-open-data` | Mixed; query metadata | Most IDC series |
24| Head scans | `idc-open-data-two` | `idc-open-idc1` | Query metadata | Collections potentially containing head imaging |
25| Commercial-restricted | `idc-open-data-cr` | `idc-open-cr` | Query metadata | Some CC BY-NC data |
27**Notes:**
28- All AWS buckets are in AWS region `us-east-1`
29- Prior to IDC v19, GCS used `public-datasets-idc` (now superseded by `idc-open-data`)
30- The head scans bucket exists for potential future policy changes regarding facial imaging data
31- **Important** Use `idc-index` to get license information - do not rely on bucket name!

Bucket Summary

PurposeAWS S3 BucketGCS BucketLicenseContent
Primary dataidc-open-dataidc-open-dataMixed; query metadataMost IDC series
Head scansidc-open-data-twoidc-open-idc1Query metadataCollections potentially containing head imaging
Commercial-restrictedidc-open-data-cridc-open-crQuery metadataSome CC BY-NC data

Notes:

  • All AWS buckets are in AWS region us-east-1
  • Prior to IDC v19, GCS used public-datasets-idc (now superseded by idc-open-data)
  • The head scans bucket exists for potential future policy changes regarding facial imaging data
  • Important Use idc-index to get license information - do not rely on bucket name!
Raw lines 19 to 32
33### Why Multiple Buckets?
351. **Licensing separation**: Some CC BY-NC data is separated into `idc-open-data-cr` / `idc-open-cr`, but restricted series also exist in `idc-open-data`; use metadata, not bucket names
362. **Head scan handling**: Collections labeled by TCIA as potentially containing head scans are in separate buckets (`idc-open-data-two` / `idc-open-idc1`) for potential future policy compliance
373. **Historical reasons**: The bucket structure evolved as IDC grew and partnered with different cloud programs

Why Multiple Buckets?

  1. Licensing separation: Some CC BY-NC data is separated into idc-open-data-cr / idc-open-cr, but restricted series also exist in idc-open-data; use metadata, not bucket names
  2. Head scan handling: Collections labeled by TCIA as potentially containing head scans are in separate buckets (idc-open-data-two / idc-open-idc1) for potential future policy compliance
  3. Historical reasons: The bucket structure evolved as IDC grew and partnered with different cloud programs
Raw lines 33 to 38
39## File Organization Within Buckets
41Files are organized by CRDC UUIDs, not DICOM UIDs. This enables versioning while maintaining consistent paths across cloud providers.

File Organization Within Buckets

Files are organized by CRDC UUIDs, not DICOM UIDs. This enables versioning while maintaining consistent paths across cloud providers.

Raw lines 39 to 42
43### Directory Structure
45```
46<bucket>/
47└── <crdc_series_uuid>/
48 ├── <crdc_instance_uuid_1>.dcm
49 ├── <crdc_instance_uuid_2>.dcm
50 └── ...
51```
53**Example path:**
54```
55s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm
56```
58- `7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9` = series UUID (folder)
59- `0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm` = instance UUID (file)

Directory Structure

<bucket>/
└── <crdc_series_uuid>/
    ├── <crdc_instance_uuid_1>.dcm
    ├── <crdc_instance_uuid_2>.dcm
    └── ...

Example path:

s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm
  • 7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9 = series UUID (folder)
  • 0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm = instance UUID (file)
Raw lines 43 to 60
61### CRDC UUIDs vs DICOM UIDs
63| Identifier Type | Format | Changes When | Use For |
64|-----------------|--------|--------------|---------|
65| DICOM UID (e.g., SeriesInstanceUID) | Numeric (e.g., `1.3.6.1.4...`) | Never (included in DICOM metadata) | Clinical identification, DICOMweb queries |
66| CRDC UUID (e.g., crdc_series_uuid) | UUID (e.g., `e127d258-37c2-...`) | Content changes | File paths, versioning, reproducibility |
68**Key insight:** A single DICOM SeriesInstanceUID may have multiple CRDC series UUIDs across IDC versions if the series content changed (instances added/removed, metadata corrected). The CRDC UUID uniquely identifies a specific version of the data.

CRDC UUIDs vs DICOM UIDs

Identifier TypeFormatChanges WhenUse For
DICOM UID (e.g., SeriesInstanceUID)Numeric (e.g., 1.3.6.1.4...)Never (included in DICOM metadata)Clinical identification, DICOMweb queries
CRDC UUID (e.g., crdc_series_uuid)UUID (e.g., e127d258-37c2-...)Content changesFile paths, versioning, reproducibility

Key insight: A single DICOM SeriesInstanceUID may have multiple CRDC series UUIDs across IDC versions if the series content changed (instances added/removed, metadata corrected). The CRDC UUID uniquely identifies a specific version of the data.

Raw lines 61 to 69
70### Mapping DICOM UIDs to File Paths
72Use `idc-index` to get file URLs from DICOM identifiers:
74```python
75from idc_index import IDCClient
77client = IDCClient()
79# Get all file URLs for a series
80series_uid = "1.3.6.1.4.1.14519.5.2.1.6450.9002.217441095430480124587725641302"
81urls = client.get_series_file_URLs(seriesInstanceUID=series_uid)
83for url in urls[:3]:
84 print(url)
85# Returns S3 URLs like: s3://idc-open-data/<crdc_series_uuid>/<crdc_instance_uuid>.dcm
86```
88Or query the index directly for URL columns:
90```python
91# Get series-level URL (points to folder)
92result = client.sql_query("""
93 SELECT SeriesInstanceUID, series_aws_url
94 FROM index
95 WHERE collection_id = 'rider_pilot' AND Modality = 'CT'
96 LIMIT 3
97""")
99print(result[['SeriesInstanceUID', 'series_aws_url']])
100```
102**Available URL column in index:**
103- `series_aws_url`: S3 URL to series folder (e.g., `s3://idc-open-data/uuid/*`)
105GCS object keys are the same, but bucket names differ: map `idc-open-data-two` to
106`idc-open-idc1` and `idc-open-data-cr` to `idc-open-cr`; `idc-open-data` stays unchanged.
107Then use `gs://` for GCS tools. `idc-index` handles this mapping internally.

Mapping DICOM UIDs to File Paths

Use idc-index to get file URLs from DICOM identifiers:

from idc_index import IDCClient

client = IDCClient()

# Get all file URLs for a series
series_uid = "1.3.6.1.4.1.14519.5.2.1.6450.9002.217441095430480124587725641302"
urls = client.get_series_file_URLs(seriesInstanceUID=series_uid)

for url in urls[:3]:
    print(url)
# Returns S3 URLs like: s3://idc-open-data/<crdc_series_uuid>/<crdc_instance_uuid>.dcm

Or query the index directly for URL columns:

# Get series-level URL (points to folder)
result = client.sql_query("""
    SELECT SeriesInstanceUID, series_aws_url
    FROM index
    WHERE collection_id = 'rider_pilot' AND Modality = 'CT'
    LIMIT 3
""")

print(result[['SeriesInstanceUID', 'series_aws_url']])

Available URL column in index:

  • series_aws_url: S3 URL to series folder (e.g., s3://idc-open-data/uuid/*)

GCS object keys are the same, but bucket names differ: map idc-open-data-two to idc-open-idc1 and idc-open-data-cr to idc-open-cr; idc-open-data stays unchanged. Then use gs:// for GCS tools. idc-index handles this mapping internally.

Raw lines 70 to 108
109## Accessing Cloud Storage
111All IDC buckets support free egress (no download fees) through partnerships with AWS Open Data and Google Public Data programs. No authentication required.

Accessing Cloud Storage

All IDC buckets support free egress (no download fees) through partnerships with AWS Open Data and Google Public Data programs. No authentication required.

Raw lines 109 to 112
113### AWS S3 Access
115**Using AWS CLI (no account required):**
116```bash
117# List bucket contents
118aws s3 ls --no-sign-request s3://idc-open-data/
120# List files in a series folder
121aws s3 ls --no-sign-request s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/
123# Download a single file
124aws s3 cp --no-sign-request \
125 s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm \
126 ./local_file.dcm
128# Download entire series folder
129aws s3 cp --no-sign-request --recursive \
130 s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ \
131 ./series_folder/
132```
134**Using s5cmd (faster for bulk downloads):**
135```bash
136# Install s5cmd
137# macOS: brew install s5cmd
138# Linux: download from https://github.com/peak/s5cmd/releases
140# Download specific series
141s5cmd --no-sign-request cp 's3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/*' ./local_folder/
143# Download from manifest file
144s5cmd --no-sign-request run manifest.txt
145```
147**s5cmd manifest format:** The `s5cmd run` command expects one s5cmd command per line, not just URLs:
148```
149cp s3://idc-open-data/uuid1/instance1.dcm ./local_folder/
150cp s3://idc-open-data/uuid1/instance2.dcm ./local_folder/
151cp s3://idc-open-data/uuid2/instance3.dcm ./local_folder/
152```
154IDC Portal exports manifests in this format. When creating manifests programmatically, use `idc-index` download methods (which handle this internally) rather than constructing manifests manually.

AWS S3 Access

Using AWS CLI (no account required):

# List bucket contents
aws s3 ls --no-sign-request s3://idc-open-data/

# List files in a series folder
aws s3 ls --no-sign-request s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/

# Download a single file
aws s3 cp --no-sign-request \
    s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/0d73f84e-70ae-4eeb-96a0-1c613b5d9229.dcm \
    ./local_file.dcm

# Download entire series folder
aws s3 cp --no-sign-request --recursive \
    s3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ \
    ./series_folder/

Using s5cmd (faster for bulk downloads):

# Install s5cmd
# macOS: brew install s5cmd
# Linux: download from https://github.com/peak/s5cmd/releases

# Download specific series
s5cmd --no-sign-request cp 's3://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/*' ./local_folder/

# Download from manifest file
s5cmd --no-sign-request run manifest.txt

s5cmd manifest format: The s5cmd run command expects one s5cmd command per line, not just URLs:

cp s3://idc-open-data/uuid1/instance1.dcm ./local_folder/
cp s3://idc-open-data/uuid1/instance2.dcm ./local_folder/
cp s3://idc-open-data/uuid2/instance3.dcm ./local_folder/

IDC Portal exports manifests in this format. When creating manifests programmatically, use idc-index download methods (which handle this internally) rather than constructing manifests manually.

Raw lines 113 to 155
156### GCS Access
158**Using gsutil:**
159```bash
160# List bucket contents
161gsutil ls gs://idc-open-data/
163# Download a series folder
164gsutil -m cp -r gs://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ ./local_folder/
165```
167**Using gcloud storage (newer CLI):**
168```bash
169gcloud storage cp -r gs://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ ./local_folder/
170```

GCS Access

Using gsutil:

# List bucket contents
gsutil ls gs://idc-open-data/

# Download a series folder
gsutil -m cp -r gs://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ ./local_folder/

Using gcloud storage (newer CLI):

gcloud storage cp -r gs://idc-open-data/7a6b2389-53c6-4c5b-b07f-6d1ed4a3eed9/ ./local_folder/
Raw lines 156 to 171
172### Python Direct Access
174```python
175import s3fs
176import gcsfs
177from idc_index import IDCClient
179# First, get a file URL from idc-index
180client = IDCClient()
181result = client.sql_query("""
182 SELECT series_aws_url
183 FROM index
184 WHERE collection_id = 'rider_pilot' AND Modality = 'CT'
185 LIMIT 1
186""")
187# series_aws_url is like: s3://idc-open-data/<uuid>/*
188series_url = result['series_aws_url'].iloc[0]
189series_path = series_url.replace('s3://', '').rstrip('/*') # e.g., "idc-open-data/<uuid>"
191# AWS S3 access
192s3 = s3fs.S3FileSystem(anon=True)
193files = s3.ls(series_path)
194with s3.open(files[0], 'rb') as f:
195 data = f.read()
197# GCS access: translate the bucket as well as the scheme
198aws_bucket, object_prefix = series_path.split('/', 1)
199gcs_bucket = {
200 'idc-open-data': 'idc-open-data',
201 'idc-open-data-two': 'idc-open-idc1',
202 'idc-open-data-cr': 'idc-open-cr',
203}[aws_bucket]
204gcs = gcsfs.GCSFileSystem(token='anon')
205files = gcs.ls(f'{gcs_bucket}/{object_prefix}')
206with gcs.open(files[0], 'rb') as f:
207 data = f.read()
208```

Python Direct Access

import s3fs
import gcsfs
from idc_index import IDCClient

# First, get a file URL from idc-index
client = IDCClient()
result = client.sql_query("""
    SELECT series_aws_url
    FROM index
    WHERE collection_id = 'rider_pilot' AND Modality = 'CT'
    LIMIT 1
""")
# series_aws_url is like: s3://idc-open-data/<uuid>/*
series_url = result['series_aws_url'].iloc[0]
series_path = series_url.replace('s3://', '').rstrip('/*')  # e.g., "idc-open-data/<uuid>"

# AWS S3 access
s3 = s3fs.S3FileSystem(anon=True)
files = s3.ls(series_path)
with s3.open(files[0], 'rb') as f:
    data = f.read()

# GCS access: translate the bucket as well as the scheme
aws_bucket, object_prefix = series_path.split('/', 1)
gcs_bucket = {
    'idc-open-data': 'idc-open-data',
    'idc-open-data-two': 'idc-open-idc1',
    'idc-open-data-cr': 'idc-open-cr',
}[aws_bucket]
gcs = gcsfs.GCSFileSystem(token='anon')
files = gcs.ls(f'{gcs_bucket}/{object_prefix}')
with gcs.open(files[0], 'rb') as f:
    data = f.read()
Raw lines 172 to 209
210## Versioning and Reproducibility
212IDC releases versioned snapshots. Retained historical objects support reproducibility, subject to removals described below.

Versioning and Reproducibility

IDC releases versioned snapshots. Retained historical objects support reproducibility, subject to removals described below.

Raw lines 210 to 213
214### How Versioning Works
2161. **Snapshots**: Each IDC version (v1, v2, ..., v24, etc.) represents a complete snapshot of all data at release time
2172. **UUID-based**: When data changes, new CRDC UUIDs are assigned; old UUIDs remain accessible
2183. **Cumulative buckets**: All versions coexist in the same buckets—old series folders
220**Version change scenarios:**
221| Change Type | DICOM UID | CRDC UUID | Effect |
222|-------------|-----------|-----------|--------|
223| New series added | New | New | New folder in bucket |
224| Instance added to series | Same | New series UUID | New folder, instances may be duplicated |
225| Metadata corrected | Same or new | New | New folder with updated files |
226| Series removed | N/A | N/A | Old folder remains, not in current index |
228**Data removal caveat:** In rare circumstances (e.g., data owner request, PHI incident), data may be removed from IDC entirely, including from all historical versions.
230**BigQuery versioned datasets (metadata only, not file storage):**
232For querying version-specific metadata, BigQuery provides versioned tables. See `bigquery_guide.md` for details.
233- `bigquery-public-data.idc_current` — alias to latest version
234- `bigquery-public-data.idc_v24` — specific version (replace 24 with desired version)

How Versioning Works

  1. Snapshots: Each IDC version (v1, v2, ..., v24, etc.) represents a complete snapshot of all data at release time
  2. UUID-based: When data changes, new CRDC UUIDs are assigned; old UUIDs remain accessible
  3. Cumulative buckets: All versions coexist in the same buckets—old series folders

Version change scenarios:

Change TypeDICOM UIDCRDC UUIDEffect
New series addedNewNewNew folder in bucket
Instance added to seriesSameNew series UUIDNew folder, instances may be duplicated
Metadata correctedSame or newNewNew folder with updated files
Series removedN/AN/AOld folder remains, not in current index

Data removal caveat: In rare circumstances (e.g., data owner request, PHI incident), data may be removed from IDC entirely, including from all historical versions.

BigQuery versioned datasets (metadata only, not file storage):

For querying version-specific metadata, BigQuery provides versioned tables. See bigquery_guide.md for details.

  • bigquery-public-data.idc_current — alias to latest version
  • bigquery-public-data.idc_v24 — specific version (replace 24 with desired version)
Raw lines 214 to 235
236### Reproducing a Previous Analysis
238The simplest way to ensure reproducibility is to save the `crdc_series_uuid` values of the data you use at analysis time:
240```python
241from idc_index import IDCClient
242import json
243from datetime import datetime, timezone
245client = IDCClient()
247# Select data for your analysis
248selection = client.sql_query("""
249 SELECT crdc_series_uuid
250 FROM index
251 WHERE collection_id = 'tcga_luad'
252 AND Modality = 'CT'
253 LIMIT 10
254""")
255series_uuids = list(selection['crdc_series_uuid'])
257# Download the data
258client.download_from_selection(crdc_series_uuid=series_uuids, downloadDir="./data")
260# Save a manifest for reproducibility
261manifest = {
262 "crdc_series_uuids": series_uuids,
263 "download_date": datetime.now(timezone.utc).isoformat(),
264 "idc_version": client.get_idc_version(),
265 "description": "CT scans for lung cancer analysis"
267with open("analysis_manifest.json", "w") as f:
268 json.dump(manifest, f, indent=2)
270# Later, reproduce the exact dataset:
271with open("analysis_manifest.json") as f:
272 manifest = json.load(f)
273client.download_from_selection(
274 crdc_series_uuid=manifest["crdc_series_uuids"],
275 downloadDir="./reproduced_data"
277```
279Since `crdc_series_uuid` identifies an immutable version of each series, saving these UUIDs identifies the exact files while they remain available. Also save the
280URLs and check the requested UUIDs against the current/prior indices before downloading;
281unrecognized selections may otherwise be skipped.

Reproducing a Previous Analysis

The simplest way to ensure reproducibility is to save the crdc_series_uuid values of the data you use at analysis time:

from idc_index import IDCClient
import json
from datetime import datetime, timezone

client = IDCClient()

# Select data for your analysis
selection = client.sql_query("""
    SELECT crdc_series_uuid
    FROM index
    WHERE collection_id = 'tcga_luad'
      AND Modality = 'CT'
    LIMIT 10
""")
series_uuids = list(selection['crdc_series_uuid'])

# Download the data
client.download_from_selection(crdc_series_uuid=series_uuids, downloadDir="./data")

# Save a manifest for reproducibility
manifest = {
    "crdc_series_uuids": series_uuids,
    "download_date": datetime.now(timezone.utc).isoformat(),
    "idc_version": client.get_idc_version(),
    "description": "CT scans for lung cancer analysis"
}
with open("analysis_manifest.json", "w") as f:
    json.dump(manifest, f, indent=2)

# Later, reproduce the exact dataset:
with open("analysis_manifest.json") as f:
    manifest = json.load(f)
client.download_from_selection(
    crdc_series_uuid=manifest["crdc_series_uuids"],
    downloadDir="./reproduced_data"
)

Since crdc_series_uuid identifies an immutable version of each series, saving these UUIDs identifies the exact files while they remain available. Also save the URLs and check the requested UUIDs against the current/prior indices before downloading; unrecognized selections may otherwise be skipped.

Raw lines 236 to 282
283## Relationship Between Buckets, Versions, and Other Access Methods

Relationship Between Buckets, Versions, and Other Access Methods

Raw lines 283 to 284
285### Data Coverage Comparison
287| Access Method | Buckets Included | Coverage | Versions |
288|---------------|------------------|----------|----------|
289| Direct bucket access | All 3 buckets | 100% | All historical |
290| `idc-index` download | All 3 buckets | 100% | Current + prior_versions_index |
291| IDC Portal | All 3 buckets | 100% | Current only |
292| DICOMweb public proxy | All 3 buckets | 100% | Current only |
293| Google Healthcare DICOM | `idc-open-data` only | Most series; verify release | Store-specific |
295**Important:** The Google Healthcare API DICOM store only replicates data from `idc-open-data`. Data in `idc-open-data-two` and `idc-open-data-cr` (fraction depends on the release) is not available via Google Healthcare DICOMweb endpoint.

Data Coverage Comparison

Access MethodBuckets IncludedCoverageVersions
Direct bucket accessAll 3 buckets100%All historical
idc-index downloadAll 3 buckets100%Current + prior_versions_index
IDC PortalAll 3 buckets100%Current only
DICOMweb public proxyAll 3 buckets100%Current only
Google Healthcare DICOMidc-open-data onlyMost series; verify releaseStore-specific

Important: The Google Healthcare API DICOM store only replicates data from idc-open-data. Data in idc-open-data-two and idc-open-data-cr (fraction depends on the release) is not available via Google Healthcare DICOMweb endpoint.

Raw lines 285 to 296
297## Best Practices
299- **Use `idc-index` for discovery**: Query metadata first, then access buckets with known UUIDs
300- **Download defaults to AWS buckets**: request GCS if needed
301- **Save manifests**: Store the `series_aws_url` or `crdc_series_uuid` values for reproducibility
302- **Check licenses**: Query `license_short_name` before commercial use; CC-NC data requires non-commercial use
303- **Use current version unless reproducing**: The `index` table has current data; use `prior_versions_index` only for exact reproducibility

Best Practices

  • **Use idc-index for discovery**: Query metadata first, then access buckets with known UUIDs
  • Download defaults to AWS buckets: request GCS if needed
  • Save manifests: Store the series_aws_url or crdc_series_uuid values for reproducibility
  • Check licenses: Query license_short_name before commercial use; CC-NC data requires non-commercial use
  • Use current version unless reproducing: The index table has current data; use prior_versions_index only for exact reproducibility
Raw lines 297 to 304
305## Troubleshooting

Troubleshooting

Raw lines 305 to 306
307### Issue: "Access Denied" when accessing buckets
308- **Cause:** Using signed requests or wrong bucket name
309- **Solution:** Use `--no-sign-request` flag with AWS CLI, or `anon=True` with Python libraries

Issue: "Access Denied" when accessing buckets

  • Cause: Using signed requests or wrong bucket name
  • Solution: Use --no-sign-request flag with AWS CLI, or anon=True with Python libraries
Raw lines 307 to 310
311### Issue: File not found at expected path
312- **Cause:** Using DICOM UID instead of CRDC UUID, or data changed in newer version
313- **Solution:** Query `idc-index` for current `series_aws_url`, or check `prior_versions_index` for historical paths

Issue: File not found at expected path

  • Cause: Using DICOM UID instead of CRDC UUID, or data changed in newer version
  • Solution: Query idc-index for current series_aws_url, or check prior_versions_index for historical paths
Raw lines 311 to 314
315### Issue: Downloaded files don't match expected series
316- **Cause:** Series was revised in a newer IDC version
317- **Solution:** Use `prior_versions_index` to find the exact version you need; compare `crdc_series_uuid` values

Issue: Downloaded files don't match expected series

  • Cause: Series was revised in a newer IDC version
  • Solution: Use prior_versions_index to find the exact version you need; compare crdc_series_uuid values
Raw lines 315 to 318
319### Issue: Some data missing from Google Healthcare DICOMweb
320- **Cause:** Google Healthcare only mirrors `idc-open-data` bucket
321- **Solution:** Use IDC public proxy for 100% coverage, or access buckets directly

Issue: Some data missing from Google Healthcare DICOMweb

  • Cause: Google Healthcare only mirrors idc-open-data bucket
  • Solution: Use IDC public proxy for 100% coverage, or access buckets directly
Raw lines 319 to 322
323## Resources
325**IDC Documentation:**
326- [Files and metadata](https://learn.canceridc.dev/data/organization-of-data/files-and-metadata) - Bucket organization details
327- [Data versioning](https://learn.canceridc.dev/data/data-versioning) - Versioning scheme explanation
328- [Resolving GUIDs and UUIDs](https://learn.canceridc.dev/data/organization-of-data/guids-and-uuids) - CRDC UUID documentation
329- [Direct loading from cloud](https://learn.canceridc.dev/data/downloading-data/direct-loading) - Python examples for cloud access
331**AWS Resources:**
332- [NCI IDC on AWS Open Data Registry](https://registry.opendata.aws/nci-imaging-data-commons/) - Bucket ARNs and access info
333- [s5cmd](https://github.com/peak/s5cmd) - High-performance S3 client (used internally by idc-index)
334- [AWS CLI S3 commands](https://docs.aws.amazon.com/cli/latest/reference/s3/) - Standard AWS command-line interface
335- [Boto3 S3 documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html) - AWS SDK for Python
337**Google Cloud Resources:**
338- [gsutil tool](https://cloud.google.com/storage/docs/gsutil) - Google Cloud Storage command-line tool
339- [gcloud storage commands](https://cloud.google.com/sdk/gcloud/reference/storage) - Modern GCS CLI (recommended over gsutil)
340- [Google Cloud Storage Python client](https://cloud.google.com/python/docs/reference/storage/latest) - GCS SDK for Python
342**Related Guides:**
343- `dicomweb_guide.md` - DICOMweb API access (alternative to direct bucket access)
344- `bigquery_guide.md` - Advanced metadata queries including versioned datasets

Resources

IDC Documentation:

AWS Resources:

Google Cloud Resources:

Related Guides:

  • dicomweb_guide.md - DICOMweb API access (alternative to direct bucket access)
  • bigquery_guide.md - Advanced metadata queries including versioned datasets
Raw lines 323 to 344