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()
}