Queries
Queries are useful for exploring the available imaging data. The general hierarchy of the cancer imaging archive (TCIA) is:
Collection -> PatientID -> StudyInstanceUID -> SeriesInstanceUID -> SOPInstanceUID
To download images, the SeriesInstanceUID
and/or SOPInstanceUID
must be known. The query functions are meant to help identify the relevant unique identifiers (UIDs)
Detailed information is available in the TCIA's user guide which includes a list of available query endpoints and the type of information returned by each query.
As mentioned in the Formats section, each query returns either a DataFrame or a Dictionary Array. The current section will exclusively use the DataFrame output. That being said, a dictionary array can always be obtained by any of these functions by passing format = "json"
as an input argument.
All collections
The names of all available collections on TCIA is obtained by:
julia> tcia_collections()
123×1 DataFrame Row │ Collection │ String31 ─────┼─────────────────────────────── 1 │ 4D-Lung 2 │ ACRIN-6698 3 │ ACRIN-Contralateral-Breast-MR 4 │ ACRIN-FLT-Breast 5 │ ACRIN-NSCLC-FDG-PET 6 │ Adrenal-ACC-Ki67-Seg 7 │ Anti-PD-1_Lung 8 │ B-mode-and-CEUS-Liver ⋮ │ ⋮ 117 │ TCGA-STAD 118 │ TCGA-THCA 119 │ TCGA-UCEC 120 │ UPENN-GBM 121 │ VICTRE 122 │ Vestibular-Schwannoma-MC-RC 123 │ Vestibular-Schwannoma-SEG 108 rows omitted
Imaging modalities
The imaging modalities in a specific collection and/or anatomy are listed by:
julia> tcia_modalities(collection = "TCGA-KIRP")
3×1 DataFrame Row │ Modality │ String3 ─────┼────────── 1 │ CT 2 │ MR 3 │ PT
julia> tcia_modalities(bodypart = "BRAIN")
2×1 DataFrame Row │ Modality │ String3 ─────┼────────── 1 │ MR 2 │ SEG
julia> tcia_modalities(collection = "CPTAC-HNSCC", bodypart = "HEAD")
0×0 DataFrame
Capitalization matters when passing in arguments, i.e. bodypart = "BRAIN"
works but passing bodypart = "brain"
will return an empty object. However, there are some cases where different versions are valid. As an example, passing bodypart = Kidney
or bodypart = "KIDNEY"
will both return valid (but different!) results. So although fully-capitalized body part names will work most of the time, do double-check if alternative spellings exist when using the bodypart
argument (see next section for names)
Anatomy/body parts
The anatomy scanned in a specific collection and/or modality are listed by:
julia> tcia_bodyparts(collection = "CPTAC-HNSCC")
0×0 DataFrame
julia> tcia_bodyparts(modality = "CT")
38×1 DataFrame Row │ BodyPartExamined │ String31 ─────┼────────────────── 1 │ ABDOMEN 2 │ ABDOMENPELVIS 3 │ ADRENAL 4 │ BLADDER 5 │ BREAST 6 │ CHEST 7 │ CHEST (THORAX) 8 │ CHESTABDOMEN ⋮ │ ⋮ 32 │ SPINE 33 │ STOMACH 34 │ THORAX 35 │ THYROID 36 │ UTERUS 37 │ WHOLEBODY 38 │ WO INTER 23 rows omitted
julia> tcia_bodyparts(collection = "CPTAC-SAR", modality = "MR")
2×1 DataFrame Row │ BodyPartExamined │ String15 ─────┼────────────────── 1 │ EXTREMITY 2 │ PELVIS
julia> tcia_bodyparts(collection = "CPTAC-SAR", modality = "CT")
4×1 DataFrame Row │ BodyPartExamined │ String15 ─────┼────────────────── 1 │ ABDOMEN 2 │ CHEST 3 │ EXTREMITY 4 │ WHOLEBODY
Manufacturers
A list of scanner manufacturers for a specific collection/modality/anatomy is obtained by
julia> tcia_manufacturers(collection = "TCGA-KICH")
3×1 DataFrame Row │ Manufacturer │ String31 ─────┼──────────────────── 1 │ GE MEDICAL SYSTEMS 2 │ SIEMENS 3 │ TOSHIBA
julia> tcia_manufacturers(modality = "CT")
┌ Warning: thread = 1 warning: parsed expected 1 columns, but didn't reach end of line around data row: 5. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 6. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 7. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 8. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 9. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 10. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 13. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 14. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 15. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 16. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 17. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 18. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 19. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 20. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 21. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 22. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 23. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 24. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 25. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 26. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 27. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 28. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 30. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 1. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 2. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 3. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 4. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 6. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 7. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 8. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 9. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 10. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 13. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 14. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 15. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 16. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 17. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 18. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 19. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 20. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 21. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 22. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 23. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 24. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 25. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 26. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 27. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 28. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 30. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 31. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 31. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 33×2 DataFrame Row │ Manufacturer Column2 │ String String15 ─────┼───────────────────────────────────────────────── 1 │ ADAC missing 2 │ Barco missing 3 │ Bayer HealthCare LLC missing 4 │ Canon Medical Systems missing 5 │ CMS Inc. 6 │ CPS missing 7 │ ELEKTA / MIM Software missing 8 │ GE MEDICAL SYSTEMS missing ⋮ │ ⋮ ⋮ 27 │ TOSHIBA missing 28 │ Unknown manufacturer missing 29 │ Varian Imaging Laboratories Switzerland 30 │ Varian Medical Systems missing 31 │ Varian Medical Systems / MIM Sof… missing 32 │ Vital Images Inc 33 │ Vital Images Inc. 18 rows omitted
julia> tcia_manufacturers(bodypart = "BREAST")
┌ Warning: thread = 1 warning: parsed expected 1 columns, but didn't reach end of line around data row: 6. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 8. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 10. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 11. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 12. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 13. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 14. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 15. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 1 / 2 columns around data row: 16. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 17×2 DataFrame Row │ Manufacturer Column2 │ String31 String31 ─────┼───────────────────────────────────────────── 1 │ 0000000 missing 2 │ Canon Medical Systems missing 3 │ Confirma Inc. missing 4 │ GE HEALTHCARE missing 5 │ GE MEDICAL SYSTEMS missing 6 │ GE MEDICAL SYSTEMS NUCLEAR 7 │ HOLOGIC Inc. 8 │ LORAD missing 9 │ Lorad A Hologic Company 10 │ LUMISYS missing 11 │ Merge Healthcare missing 12 │ Philips Healthcare missing 13 │ Philips Medical Systems missing 14 │ QIICR missing 15 │ SIEMENS missing 16 │ Siemens missing 17 │ VICTRE missing
The same manufacturer can have different names, e.g. Philips
/Philips Medical Systems
and SIEMENS
/Siemens
.
Patients
The patients in a given collection are listed by:
julia> tcia_patients(collection = "TCGA-SARC")
5×9 DataFrame Row │ PatientId PatientName PatientBirthDate PatientSex EthnicGroup ⋯ │ String15 String15 Missing String1 Missing ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ TCGA-QQ-A5V2 TCGA-QQ-A5V2 missing M missing ⋯ 2 │ TCGA-QQ-A5VC TCGA-QQ-A5VC missing F missing 3 │ TCGA-QQ-A8VF TCGA-QQ-A8VF missing M missing 4 │ TCGA-QQ-A8VH TCGA-QQ-A8VH missing F missing 5 │ TCGA-QQ-A8VG TCGA-QQ-A8VG missing M missing ⋯ 4 columns omitted
Patients for specific modality
To get a patients for which a specific modality was used, a slightly different function is used:
julia> tcia_patients_by_modality(collection = "TCGA-SARC", modality = "CT")
4×1 DataFrame Row │ PatientId │ String15 ─────┼────────────── 1 │ TCGA-QQ-A5V2 2 │ TCGA-QQ-A5VC 3 │ TCGA-QQ-A8VF 4 │ TCGA-QQ-A8VG
julia> tcia_patients_by_modality(collection = "TCGA-SARC", modality = "MR")
2×1 DataFrame Row │ PatientId │ String15 ─────┼────────────── 1 │ TCGA-QQ-A8VF 2 │ TCGA-QQ-A8VH
Although the functionality of tcia_patients_by_modality()
could be combined into the tcia_patients()
function, they use a different query endpoint so the two functions were given different names to keep that difference explicit.
Patients added after specific date
In large collections, it can be useful to query patients that were added after a date specified as YYYY/MM/DD. This is accomplished by:
julia> tcia_newpatients(collection = "TCGA-GBM", date = "2015/01/01")
0×0 DataFrame
Patient studies
A list of visits/studies for a given collection/patient is obtained by:
julia> tcia_studies(collection = "TCGA-THCA")
┌ Warning: thread = 1 warning: parsed expected 15 columns, but didn't reach end of line around data row: 7. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: parsed expected 15 columns, but didn't reach end of line around data row: 7. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: parsed expected 15 columns, but didn't reach end of line around data row: 7. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 7×16 DataFrame Row │ StudyInstanceUID StudyDate StudyDescript ⋯ │ String String31 String ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 2004-09-26 00:00:00.0 Outside Read ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 2004-05-27 00:00:00.0 Outside Read 3 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 2004-06-13 00:00:00.0 PET/CT Tumor 4 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 2004-07-21 00:00:00.0 CT NECK SOFT 5 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 2004-07-05 00:00:00.0 Outside Read ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.3023.401… 1996-04-14 00:00:00.0 CT NECK W/ CO 7 │ 1.3.6.1.4.1.14519.5.2.1.3023.401… 1996-03-09 00:00:00.0 CT NECK W/ CO 14 columns omitted
julia> tcia_studies(patient = "TCGA-QQ-A8VF")
2×15 DataFrame Row │ StudyInstanceUID StudyDate StudyDescript ⋯ │ String String31 String31 ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1997-11-26 00:00:00.0 MRI LOWER EXT ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1997-11-29 00:00:00.0 CT CHEST W/ C 13 columns omitted
If the unique identifier (UID) for a study is known (a.k.a. StudyInstanceUID), then that can also be used
julia> tcia_studies(study = "1.3.6.1.4.1.14519.5.2.1.3023.4024.298690116465423805879206377806")
1×15 DataFrame Row │ StudyInstanceUID StudyDate StudyDescript ⋯ │ String String31 String31 ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1997-11-29 00:00:00.0 CT CHEST W/ C ⋯ 13 columns omitted
Patient studies added after specific data
A list of visits/studies that were added after some date, formatted by YYYY-MM-DD, can be obtained by:
julia> tcia_newstudies(collection="TCGA-GBM", date="2015-01-01")
0×0 DataFrame
Imaging series
Each patient study consists of one or more imaging series which can be obtained by:
julia> tcia_series(collection = "TCGA-THCA")
28×20 DataFrame Row │ SeriesInstanceUID StudyInstanceUID M ⋯ │ String String S ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C 3 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C 4 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C 5 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C 7 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C 8 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… C ⋮ │ ⋮ ⋮ ⋱ 22 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… P ⋯ 23 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… P 24 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… P 25 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… P 26 │ 1.3.6.1.4.1.14519.5.2.1.8421.401… 1.3.6.1.4.1.14519.5.2.1.8421.401… P ⋯ 27 │ 1.3.6.1.4.1.14519.5.2.1.3023.401… 1.3.6.1.4.1.14519.5.2.1.3023.401… C 28 │ 1.3.6.1.4.1.14519.5.2.1.3023.401… 1.3.6.1.4.1.14519.5.2.1.3023.401… C 18 columns and 13 rows omitted
julia> tcia_series(patient = "TCGA-QQ-A8VF")
15×20 DataFrame Row │ SeriesInstanceUID StudyInstanceUID M ⋯ │ String String S ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 3 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 4 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 5 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 7 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 8 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M 9 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… M ⋯ 10 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 11 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 12 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 13 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C ⋯ 14 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 15 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 18 columns omitted
julia> tcia_series(study = "1.3.6.1.4.1.14519.5.2.1.3023.4024.298690116465423805879206377806")
6×20 DataFrame Row │ SeriesInstanceUID StudyInstanceUID M ⋯ │ String String S ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 3 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 4 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 5 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.3023.402… 1.3.6.1.4.1.14519.5.2.1.3023.402… C 18 columns omitted
julia> tcia_series(modality = "CT", manufacturer = "TOSHIBA")
┌ Warning: thread = 1 warning: parsed expected 20 columns, but didn't reach end of line around data row: 238. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: parsed expected 20 columns, but didn't reach end of line around data row: 238. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 240. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 241. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 242. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 243. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 244. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 245. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 246. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 247. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 248. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 249. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 250. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 251. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 252. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 253. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 254. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 255. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 256. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 257. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 258. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 259. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 260. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 261. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 262. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 263. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 264. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 265. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 266. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 267. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 268. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 269. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 270. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 271. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 272. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 273. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 274. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 275. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 276. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 277. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 278. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 279. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 280. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 281. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 282. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 283. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 284. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 285. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 286. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 287. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 288. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 289. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 290. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 291. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 292. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 293. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 294. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 295. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 296. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 297. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 298. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 299. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 300. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 301. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 302. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 303. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 304. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 305. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 306. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 307. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 308. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 309. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 310. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 311. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 312. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 313. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 314. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 315. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 316. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 317. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 318. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 319. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 320. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 321. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 322. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 323. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 324. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 325. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 326. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 327. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 328. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 329. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 330. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 331. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 332. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 333. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 334. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 335. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 336. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 337. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 338. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 339. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1 warning: only found 20 / 26 columns around data row: 340. Filling remaining columns with `missing` └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:586 ┌ Warning: thread = 1: too many warnings, silencing any further warnings └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:591 ┌ Warning: thread = 1 warning: parsed expected 26 columns, but didn't reach end of line around data row: 403. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: parsed expected 26 columns, but didn't reach end of line around data row: 403. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 ┌ Warning: thread = 1 warning: parsed expected 26 columns, but didn't reach end of line around data row: 403. Parsing extra columns and widening final columnset └ @ CSV ~/.julia/packages/CSV/aoJqo/src/file.jl:587 2068×27 DataFrame Row │ SeriesInstanceUID StudyInstanceUID ⋯ │ String String ⋯ ──────┼───────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… 3 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… 4 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… 5 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… 7 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… 8 │ 1.3.6.1.4.1.14519.5.2.1.6279.600… 1.3.6.1.4.1.14519.5.2.1.6279.600… ⋮ │ ⋮ ⋮ ⋱ 2062 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… ⋯ 2063 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… 2064 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… 2065 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… 2066 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… ⋯ 2067 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… 2068 │ 1.3.6.1.4.1.14519.5.2.1.1600.120… 1.3.6.1.4.1.14519.5.2.1.1600.120… 25 columns and 2053 rows omitted
julia> tcia_series(bodypart = "EXTREMITY")
924×20 DataFrame Row │ SeriesInstanceUID StudyInstanceUID M ⋯ │ String String S ⋯ ─────┼────────────────────────────────────────────────────────────────────────── 1 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… C ⋯ 2 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R 3 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R 4 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R 5 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R ⋯ 6 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R 7 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R 8 │ 1.3.6.1.4.1.14519.5.2.1.5168.190… 1.3.6.1.4.1.14519.5.2.1.5168.190… R ⋮ │ ⋮ ⋮ ⋱ 918 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M ⋯ 919 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M 920 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M 921 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M 922 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M ⋯ 923 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M 924 │ 1.3.6.1.4.1.14519.5.2.1.1620.122… 1.3.6.1.4.1.14519.5.2.1.1620.122… M 18 columns and 909 rows omitted
This query's importance is hinted by the smorgasbord of parameters it accepts. That's because this query returns the SeriesInstanceUID
which is needed to download images. Although the above examples only show PatientID
, the query actually returns more information which is not shown because of limited screen space. The complete list of columns are:
julia> series_dataframe = tcia_series(patient = "TCGA-QQ-A8VF");
julia> names(series_dataframe)
20-element Vector{String}: "SeriesInstanceUID" "StudyInstanceUID" "Modality" "ProtocolName" "SeriesDate" "SeriesDescription" "BodyPartExamined" "SeriesNumber" "AnnotationsFlag" "Collection" "PatientID" "Manufacturer" "ManufacturerModelName" "SoftwareVersions" "ImageCount" "TimeStamp" "LicenseName" "LicenseURI" "CollectionURI" "FileSize"
The entire table could have been printed by:
show(series_dataframe, allrows = true, allcols = true)
Passing format = "json"
will result in one fewer column. This is because the AnnotationsFlag
field is returned for CSV output but not for JSON.
Imaging series size
The size (in bytes) and number of images for a given imaging series is given by
julia> tcia_series_size(series = "1.3.6.1.4.1.14519.5.2.1.4591.4001.241972527061347495484079664948")
1×2 DataFrame Row │ TotalSizeInBytes ObjectCount │ Int64 Int64 ─────┼─────────────────────────────── 1 │ 24012211806228 124
It is recommended that tcia_series_size()
should not be used with format = json
. This is because the json version interprets the TotalSizeInBytes
as string/text rather than a number.
Service-Object Pairs (SOP)
Each imaging series consists of one or more images, each of which have a service-object-pair unique identifier (SOPInstanceUID). These can be listed by
julia> tcia_sop(series = "1.3.6.1.4.1.14519.5.2.1.4591.4001.241972527061347495484079664948")
0×0 DataFrame
These identifiers are useful for accessing a specific image without having to download the entire imaging series.