Assorted dataset queries#

Define dataset path#

from _local_dir import examples_dir

test_bids_read_path = examples_dir / "../../tests/data-notebooks"

Set-up: reading a dataset from disk#

from pprint import pprint

from clinicaio import BIDSDataset, DataType, ImageQuery, Session

dataset = BIDSDataset.populate_from_dir(
    bids_dir=test_bids_read_path,
    subjects_info=False,
    sessions_info=False,
    image_scans_info=False,
)

for image in dataset.all_images():
    print(image)

Full ImageQuery#

image_query = ImageQuery(
    subjects=["sub-2"],
    sessions=["ses-M000"],
    data_type=DataType.PET,
    entities={"trc": "18FFDG", "rec": "coregiso8"},
    suffix="pet",
)
list(dataset.query_images_nifti_paths(image_query))

Give me all tsv files#

[subject.info for subject in dataset.all_subjects() if len(subject.info) != 0]
[session.info for session in dataset.all_sessions() if len(session.info) != 0]
[image.scan_info for image in dataset.all_images() if len(image.scan_info) != 0]

Give me all images with this tracer (ex 18FFDG)#

images = dataset.query_images(ImageQuery(entities={"trc": "18FFDG"}))
for image in images:
    print(image.get_nifti_image_path(), image)

Give me all T1w images paths#

list(dataset.query_images_nifti_paths(ImageQuery(suffix="T1w")))

Give me all modalities for this one subject#

subject_id = "sub-2"
print(subject_id)
subject = dataset.subject_by_id(subject_id)
assert subject is not None
set(image.suffix for image in subject.all_images())

Give me all sessions for this one subject#

subject_id = "sub-2"
print(subject_id)
subject = dataset.subject_by_id(subject_id)
assert subject is not None
pprint(list(subject.all_sessions()))

Give me all subjects/sessions that have both a T1 and a PET image for the same session#

def has_t1_and_pet(session: Session):
    has_t1 = any(image.suffix == "T1w" for image in session.all_images())

    return (
        has_t1 and next(iter(session.images_by_data_type(DataType.PET)), None) is None
    )


subjects_and_sessions_with_t1_and_pet = filter(
    has_t1_and_pet,
    dataset.all_sessions(),
)
for session in subjects_and_sessions_with_t1_and_pet:
    subject = session.parent_subject
    print(subject.id)
    pprint(session)
    print("========================")

Give me the subjects that have more than one session#

pprint(
    list(filter(lambda subject: subject.sessions_count() > 1, dataset.all_subjects()))
)

Check that all subjects/sessions have FLAIR images#

def session_has_flair_image(session: Session):
    any(image.suffix == "FLAIR" for image in session.all_images())


all(session_has_flair_image(session) for session in dataset.all_sessions())

Give me all the modalities available for each subject for this list of subjects#

subjects = dataset.all_subjects()

{subject.id: {image.suffix for image in subject.all_images()} for subject in subjects}

Give me all the modalities available for all subjects for this list of subjects#

print(
    {
        f"{image.suffix}"
        for subject in dataset.all_subjects()
        for image in subject.all_images()
    }
)

Can you tell me if all subjects have only one session#

all(subject.sessions_count() == 1 for subject in dataset.all_subjects())

For each subject, count the number of sessions that have at least an image with the given modality#

# aka suffix in BIDS
modality = "T1w"

# note: sum(1 for .. in .. if ..) is so that we do not materialize a (potentially big) list
# just to count the matching sessions
{
    subject.id: sum(
        1
        for session in subject.all_sessions()
        if any(img.suffix == modality for img in session.all_images())
    )
    for subject in dataset.all_subjects()
}