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.

Note

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
Note

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
Note

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"
Note

The entire table could have been printed by:

show(series_dataframe, allrows = true, allcols = true)
Warning

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
Warning

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.