Exemplo n.º 1
0
    mri_list = mri_list[mri_list.SEQUENCE.map(
        lambda x: not any(subs in x for subs in unwanted_sequences))]

    for subj in subjs_list:

        # Filter ADNIMERGE, MRI_LIST and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values('EXAMDATE')

        mri_list_subj = mri_list[mri_list.SUBJECT == subj]
        mri_list_subj = mri_list_subj.sort_values('SCANDATE')

        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mri_list_subj, adnimerge_subj,
                                      'FLAIR')

        for visit_info in visits.keys():
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            visit_mri_list = mri_list_subj[mri_list_subj.VISIT == visit_str]
            flair = flair_image(subj, timepoint, visits[visit_info],
                                visit_mri_list, mayo_mri_qc_subj)

            if flair is not None:
                row_to_append = pd.DataFrame(flair, index=[
                    'i',
                ])
                flair_dfs_list.append(row_to_append)
Exemplo n.º 2
0
    unwanted_sequences = ['MB', 'ADC', 'FA', 'TRACEW', 'Enhanced', 'Reg']
    mri_list = mri_list[mri_list.SEQUENCE.map(lambda x: not any(subs in x for subs in unwanted_sequences))]

    for subj in subjs_list:

        # Filter ADNIMERGE, MRI_LIST and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values('EXAMDATE')

        mri_list_subj = mri_list[mri_list.SUBJECT == subj]
        mri_list_subj = mri_list_subj.sort_values('SCANDATE')

        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mri_list_subj, adnimerge_subj, "DWI")

        for visit_info in visits.keys():
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            visit_mri_list = mri_list_subj[mri_list_subj.VISIT == visit_str]
            axial = dwi_image(subj, timepoint, visits[visit_info], visit_mri_list, mayo_mri_qc_subj)

            if axial is not None:
                row_to_append = pd.DataFrame(axial, index=['i', ])
                dwi_dfs_list.append(row_to_append)

    if dwi_dfs_list:
        dwi_df = pd.concat(dwi_dfs_list, ignore_index=True)
Exemplo n.º 3
0
def compute_t1_paths(source_dir, csv_dir, dest_dir, subjs_list):
    """Compute the paths to T1 MR images and store them in a tsv file

    Args:
        source_dir: path to the ADNI directory
        csv_dir: path to the clinical data directory
        dest_dir: path to the destination BIDS directory
        subjs_list: subjects list

    Returns:
        images: a dataframe with all the paths to the T1 MR images that will be converted into BIDS

    """

    from os import path, makedirs

    import pandas as pd

    from clinica.utils.stream import cprint
    from clinica.iotools.converters.adni_to_bids.adni_utils import visits_to_timepoints, find_image_path

    t1_col_df = [
        'Subject_ID', 'VISCODE', 'Visit', 'Sequence', 'Scan_Date', 'Study_ID',
        'Field_Strength', 'Series_ID', 'Image_ID', 'Original'
    ]
    t1_df = pd.DataFrame(columns=t1_col_df)
    t1_dfs_list = []

    # Loading needed .csv files
    adni_merge = pd.read_csv(path.join(csv_dir, 'ADNIMERGE.csv'),
                             sep=',',
                             low_memory=False)
    mprage_meta = pd.read_csv(path.join(csv_dir, 'MPRAGEMETA.csv'),
                              sep=',',
                              low_memory=False)
    mri_quality = pd.read_csv(path.join(csv_dir, 'MRIQUALITY.csv'),
                              sep=',',
                              low_memory=False)
    mayo_mri_qc = pd.read_csv(path.join(csv_dir,
                                        'MAYOADIRL_MRI_IMAGEQC_12_08_15.csv'),
                              sep=',',
                              low_memory=False)
    # Keep only T1 scans
    mayo_mri_qc = mayo_mri_qc[mayo_mri_qc.series_type == 'T1']

    # We will convert the images for each subject in the subject list
    for subj in subjs_list:

        # Filter ADNIMERGE, MPRAGE METADATA and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values('EXAMDATE')

        mprage_meta_subj = mprage_meta[mprage_meta.SubjectID == subj]
        mprage_meta_subj = mprage_meta_subj.sort_values('ScanDate')

        mri_quality_subj = mri_quality[mri_quality.RID == int(subj[-4:])]
        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mprage_meta_subj, adnimerge_subj,
                                      "T1", "Visit", "ScanDate")

        for visit_info in visits.keys():
            cohort = visit_info[1]
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            image_dict = None

            if cohort in ('ADNI1', 'ADNIGO', 'ADNI2'):
                image_dict = adni1go2_image(
                    subj,
                    timepoint,
                    visit_str,
                    mprage_meta_subj,
                    mri_quality_subj,
                    mayo_mri_qc_subj,
                    preferred_field_strength=1.5 if cohort == 'ADNI1' else 3.0)
            elif cohort == 'ADNI3':
                image_dict = adni3_image(subj, timepoint, visit_str,
                                         mprage_meta_subj, mayo_mri_qc_subj)
            else:
                cprint("Subject %s visit %s belongs to an unknown cohort: %s" %
                       (subj, visit_str, cohort))

            if image_dict is not None:
                row_to_append = pd.DataFrame(image_dict, index=[
                    'i',
                ])
                t1_dfs_list.append(row_to_append)

    if t1_dfs_list:
        t1_df = pd.concat(t1_dfs_list, ignore_index=True)

    # Exceptions
    # ==========
    conversion_errors = [  # Eq_1
        ('031_S_0830', 'm48'),
        ('100_S_0995', 'm18'),
        ('031_S_0867', 'm48'),
        ('100_S_0892', 'm18'),
        # Empty folders
        # ('029_S_0845', 'm24'),
        # ('094_S_1267', 'm24'),
        # ('029_S_0843', 'm24'),
        # ('027_S_0307', 'm48'),
        # ('057_S_1269', 'm24'),
        # ('036_S_4899', 'm03'),
        # ('033_S_1016', 'm120'),
        # ('130_S_4984', 'm12'),
        # ('027_S_4802', 'm06'),
        # ('131_S_0409', 'bl'),
        # ('082_S_4224', 'm24'),
        # ('006_S_4960', 'bl'),
        # ('006_S_4960', 'm03'),
        # ('006_S_4960', 'm06'),
        # ('006_S_4960', 'm12'),
        # ('006_S_4960', 'm24'),
        # ('006_S_4960', 'm36'),
        # ('006_S_4960', 'm72'),
        # ('022_S_5004', 'bl'),
        # ('022_S_5004', 'm03'),
        # Several images: T1wa ...
        ('006_S_4485', 'm84'),
        ('029_S_2395', 'm72'),
        ('114_S_6039', 'bl'),
        ('016_S_4952', 'm48')
    ]

    # Removing known exceptions from images to convert
    if not t1_df.empty:
        error_indices = t1_df.index[t1_df.apply(lambda x: (
            (x.Subject_ID, x.VISCODE) in conversion_errors),
                                                axis=1)]
        t1_df.drop(error_indices, inplace=True)

    # Checking for images paths in filesystem
    images = find_image_path(t1_df, source_dir, 'T1', 'S', 'Series_ID')

    # Store the paths inside a file called conversion_info inside the input directory
    t1_tsv_path = path.join(dest_dir, 'conversion_info')
    if not path.exists(t1_tsv_path):
        makedirs(t1_tsv_path)
    images.to_csv(path.join(t1_tsv_path, 't1_paths.tsv'),
                  sep='\t',
                  index=False)

    return images
Exemplo n.º 4
0
def compute_t1_paths(source_dir, csv_dir, dest_dir, subjs_list,
                     conversion_dir):
    """Compute the paths to T1 MR images and store them in a TSV file.

    Args:
        source_dir: path to the ADNI directory
        csv_dir: path to the clinical data directory
        dest_dir: path to the destination BIDS directory
        subjs_list: subjects list
        conversion_dir: path to the TSV files including the paths to original images

    Returns:
        images: a dataframe with all the paths to the T1 MR images that will be converted into BIDS
    """
    from os import path

    import pandas as pd

    from clinica.iotools.converters.adni_to_bids.adni_utils import (
        find_image_path,
        visits_to_timepoints,
    )
    from clinica.utils.stream import cprint

    t1_col_df = [
        "Subject_ID",
        "VISCODE",
        "Visit",
        "Sequence",
        "Scan_Date",
        "Study_ID",
        "Field_Strength",
        "Series_ID",
        "Image_ID",
        "Original",
    ]
    t1_df = pd.DataFrame(columns=t1_col_df)
    t1_dfs_list = []

    # Loading needed .csv files
    adni_merge = pd.read_csv(path.join(csv_dir, "ADNIMERGE.csv"),
                             sep=",",
                             low_memory=False)
    mprage_meta = pd.read_csv(path.join(csv_dir, "MPRAGEMETA.csv"),
                              sep=",",
                              low_memory=False)
    mri_quality = pd.read_csv(path.join(csv_dir, "MRIQUALITY.csv"),
                              sep=",",
                              low_memory=False)
    mayo_mri_qc = pd.read_csv(
        path.join(csv_dir, "MAYOADIRL_MRI_IMAGEQC_12_08_15.csv"),
        sep=",",
        low_memory=False,
    )
    # Keep only T1 scans
    mayo_mri_qc = mayo_mri_qc[mayo_mri_qc.series_type == "T1"]

    # We will convert the images for each subject in the subject list
    for subj in subjs_list:

        # Filter ADNIMERGE, MPRAGE METADATA and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values("EXAMDATE")

        mprage_meta_subj = mprage_meta[mprage_meta.SubjectID == subj]
        mprage_meta_subj = mprage_meta_subj.sort_values("ScanDate")

        mri_quality_subj = mri_quality[mri_quality.RID == int(subj[-4:])]
        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mprage_meta_subj, adnimerge_subj,
                                      "T1", "Visit", "ScanDate")

        for visit_info in visits.keys():
            cohort = visit_info[1]
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            image_dict = None

            if cohort in ("ADNI1", "ADNIGO", "ADNI2"):
                image_dict = adni1go2_image(
                    subj,
                    timepoint,
                    visit_str,
                    mprage_meta_subj,
                    mri_quality_subj,
                    mayo_mri_qc_subj,
                    preferred_field_strength=1.5 if cohort == "ADNI1" else 3.0,
                )
            elif cohort == "ADNI3":
                image_dict = adni3_image(subj, timepoint, visit_str,
                                         mprage_meta_subj, mayo_mri_qc_subj)
            else:
                cprint(
                    f"Subject {subj} visit {visit_str} belongs to an unknown cohort: {cohort}"
                )

            if image_dict is not None:
                row_to_append = pd.DataFrame(
                    image_dict,
                    index=[
                        "i",
                    ],
                )
                t1_dfs_list.append(row_to_append)

    if t1_dfs_list:
        t1_df = pd.concat(t1_dfs_list, ignore_index=True)

    # Exceptions
    # ==========
    conversion_errors = [  # Eq_1
        ("031_S_0830", "m48"),
        ("100_S_0995", "m18"),
        ("031_S_0867", "m48"),
        ("100_S_0892", "m18"),
        ("003_S_6264", "m12"),
        # Empty folders
        # ('029_S_0845', 'm24'),
        # ('094_S_1267', 'm24'),
        # ('029_S_0843', 'm24'),
        # ('027_S_0307', 'm48'),
        # ('057_S_1269', 'm24'),
        # ('036_S_4899', 'm03'),
        # ('033_S_1016', 'm120'),
        # ('130_S_4984', 'm12'),
        # ('027_S_4802', 'm06'),
        # ('131_S_0409', 'bl'),
        # ('082_S_4224', 'm24'),
        # ('006_S_4960', 'bl'),
        # ('006_S_4960', 'm03'),
        # ('006_S_4960', 'm06'),
        # ('006_S_4960', 'm12'),
        # ('006_S_4960', 'm24'),
        # ('006_S_4960', 'm36'),
        # ('006_S_4960', 'm72'),
        # ('022_S_5004', 'bl'),
        # ('022_S_5004', 'm03'),
        # Several images: T1wa ...
        ("006_S_4485", "m84"),
        ("029_S_2395", "m72"),
        ("114_S_6039", "bl"),
        ("016_S_4952", "m48"),
    ]

    # Removing known exceptions from images to convert
    if not t1_df.empty:
        error_indices = t1_df.index[t1_df.apply(lambda x: (
            (x.Subject_ID, x.VISCODE) in conversion_errors),
                                                axis=1)]
        t1_df.drop(error_indices, inplace=True)

    # Checking for images paths in filesystem
    images = find_image_path(t1_df, source_dir, "T1", "S", "Series_ID")
    images.to_csv(path.join(conversion_dir, "t1_paths.tsv"),
                  sep="\t",
                  index=False)

    return images
Exemplo n.º 5
0
def compute_fmri_path(source_dir, csv_dir, dest_dir, subjs_list):
    """
    Compute the paths to fMR images

    Args:
        source_dir: path to the ADNI directory
        csv_dir: path to the clinical data directory
        dest_dir: path to the destination BIDS directory
        subjs_list: subjects list

    Returns: pandas Dataframe containing the path for each fmri

    """

    from os import path, mkdir
    import pandas as pd
    from clinica.iotools.converters.adni_to_bids.adni_utils import find_image_path, visits_to_timepoints

    fmri_col = [
        'Subject_ID', 'VISCODE', 'Visit', 'Sequence', 'Scan_Date', 'Study_ID',
        'Field_Strength', 'Series_ID', 'Image_ID'
    ]
    fmri_df = pd.DataFrame(columns=fmri_col)
    fmri_dfs_list = []

    # Loading needed .csv files
    adni_merge = pd.read_csv(path.join(csv_dir, 'ADNIMERGE.csv'),
                             sep=',',
                             low_memory=False)

    mayo_mri_qc = pd.read_csv(path.join(csv_dir,
                                        'MAYOADIRL_MRI_IMAGEQC_12_08_15.csv'),
                              sep=',',
                              low_memory=False)
    mayo_mri_qc = mayo_mri_qc[mayo_mri_qc.series_type == 'fMRI']
    mayo_mri_qc.columns = [x.upper() for x in mayo_mri_qc.columns]

    mayo_mri_qc3 = pd.read_csv(path.join(csv_dir,
                                         'MAYOADIRL_MRI_QUALITY_ADNI3.csv'),
                               sep=',',
                               low_memory=False)
    mayo_mri_qc3 = mayo_mri_qc3[mayo_mri_qc3.SERIES_TYPE == 'EPB']

    # Concatenating visits in both QC files
    mayo_mri_qc = pd.concat([mayo_mri_qc, mayo_mri_qc3],
                            axis=0,
                            ignore_index=True,
                            sort=False)

    mri_list = pd.read_csv(path.join(csv_dir, 'MRILIST.csv'),
                           sep=',',
                           low_memory=False)

    # Selecting only fMRI images that are not Multiband
    mri_list = mri_list[mri_list.SEQUENCE.str.contains(
        'MRI')]  # 'MRI' includes all fMRI and fMRI scans, but not others
    unwanted_sequences = ['MB']
    mri_list = mri_list[mri_list.SEQUENCE.map(
        lambda x: not any(subs in x for subs in unwanted_sequences))]

    # We will convert the images for each subject in the subject list
    for subj in subjs_list:

        # Filter ADNIMERGE, MRI_LIST and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values('EXAMDATE')

        mri_list_subj = mri_list[mri_list.SUBJECT == subj]
        mri_list_subj = mri_list_subj.sort_values('SCANDATE')

        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mri_list_subj, adnimerge_subj,
                                      "fMRI")

        for visit_info in visits.keys():
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            visit_mri_list = mri_list_subj[mri_list_subj.VISIT == visit_str]
            image = fmri_image(subj, timepoint, visits[visit_info],
                               visit_mri_list, mayo_mri_qc_subj)

            if image is not None:
                row_to_append = pd.DataFrame(image, index=[
                    'i',
                ])
                fmri_dfs_list.append(row_to_append)

    if fmri_dfs_list:
        fmri_df = pd.concat(fmri_dfs_list, ignore_index=True)

    # Exceptions
    # ==========
    conversion_errors = [
        ('006_S_4485', 'm84'),
        # Eq_1
        ('094_S_4503', 'm24'),
        ('009_S_4388', 'm72'),
        ('036_S_6088', 'bl'),
        ('036_S_6134', 'bl'),
        # Multiple images
        ('029_S_2395', 'm72')
    ]

    # Removing known exceptions from images to convert
    if not fmri_df.empty:
        error_ind = fmri_df.index[fmri_df.apply(lambda x: (
            (x.Subject_ID, x.VISCODE) in conversion_errors),
                                                axis=1)]
        fmri_df.drop(error_ind, inplace=True)

    # Checking for images paths in filesystem
    images = find_image_path(fmri_df, source_dir, 'fMRI', 'S', 'Series_ID')

    fmri_tsv_path = path.join(dest_dir, 'conversion_info')
    if not path.exists(fmri_tsv_path):
        mkdir(fmri_tsv_path)
    images.to_csv(path.join(fmri_tsv_path, 'fmri_paths.tsv'),
                  sep='\t',
                  index=False)

    return images
Exemplo n.º 6
0
def compute_fmri_path(source_dir, csv_dir, dest_dir, subjs_list,
                      conversion_dir):
    """Compute the paths to fMR images.

    Args:
        source_dir: path to the ADNI directory
        csv_dir: path to the clinical data directory
        dest_dir: path to the destination BIDS directory
        subjs_list: subjects list
        conversion_dir: path to the TSV files including the paths to original images

    Returns:
        pandas Dataframe containing the path for each fmri
    """
    from os import path

    import pandas as pd

    from clinica.iotools.converters.adni_to_bids.adni_utils import (
        find_image_path,
        visits_to_timepoints,
    )

    fmri_col = [
        "Subject_ID",
        "VISCODE",
        "Visit",
        "Sequence",
        "Scan_Date",
        "Study_ID",
        "Field_Strength",
        "Series_ID",
        "Image_ID",
    ]
    fmri_df = pd.DataFrame(columns=fmri_col)
    fmri_dfs_list = []

    # Loading needed .csv files
    adni_merge = pd.read_csv(path.join(csv_dir, "ADNIMERGE.csv"),
                             sep=",",
                             low_memory=False)

    mayo_mri_qc = pd.read_csv(
        path.join(csv_dir, "MAYOADIRL_MRI_IMAGEQC_12_08_15.csv"),
        sep=",",
        low_memory=False,
    )
    mayo_mri_qc = mayo_mri_qc[mayo_mri_qc.series_type == "fMRI"]
    mayo_mri_qc.columns = [x.upper() for x in mayo_mri_qc.columns]

    mayo_mri_qc3 = pd.read_csv(path.join(csv_dir,
                                         "MAYOADIRL_MRI_QUALITY_ADNI3.csv"),
                               sep=",",
                               low_memory=False)
    mayo_mri_qc3 = mayo_mri_qc3[mayo_mri_qc3.SERIES_TYPE == "EPB"]

    # Concatenating visits in both QC files
    mayo_mri_qc = pd.concat([mayo_mri_qc, mayo_mri_qc3],
                            axis=0,
                            ignore_index=True,
                            sort=False)

    mri_list = pd.read_csv(path.join(csv_dir, "MRILIST.csv"),
                           sep=",",
                           low_memory=False)

    # Selecting only fMRI images that are not Multiband
    mri_list = mri_list[mri_list.SEQUENCE.str.contains(
        "MRI")]  # 'MRI' includes all fMRI and fMRI scans, but not others
    unwanted_sequences = ["MB"]
    mri_list = mri_list[mri_list.SEQUENCE.map(
        lambda x: not any(subs in x for subs in unwanted_sequences))]

    # We will convert the images for each subject in the subject list
    for subj in subjs_list:

        # Filter ADNIMERGE, MRI_LIST and QC for only one subject and sort the rows/visits by examination date
        adnimerge_subj = adni_merge[adni_merge.PTID == subj]
        adnimerge_subj = adnimerge_subj.sort_values("EXAMDATE")

        mri_list_subj = mri_list[mri_list.SUBJECT == subj]
        mri_list_subj = mri_list_subj.sort_values("SCANDATE")

        mayo_mri_qc_subj = mayo_mri_qc[mayo_mri_qc.RID == int(subj[-4:])]

        # Obtain corresponding timepoints for the subject visits
        visits = visits_to_timepoints(subj, mri_list_subj, adnimerge_subj,
                                      "fMRI")

        for visit_info in visits.keys():
            timepoint = visit_info[0]
            visit_str = visits[visit_info]

            visit_mri_list = mri_list_subj[mri_list_subj.VISIT == visit_str]
            image = fmri_image(subj, timepoint, visits[visit_info],
                               visit_mri_list, mayo_mri_qc_subj)

            if image is not None:
                row_to_append = pd.DataFrame(
                    image,
                    index=[
                        "i",
                    ],
                )
                fmri_dfs_list.append(row_to_append)

    if fmri_dfs_list:
        fmri_df = pd.concat(fmri_dfs_list, ignore_index=True)

    # Exceptions
    # ==========
    conversion_errors = [
        ("006_S_4485", "m84"),
        ("123_S_4127", "m96"),
        # Eq_1
        ("094_S_4503", "m24"),
        ("009_S_4388", "m72"),
        ("036_S_6088", "bl"),
        ("036_S_6134", "bl"),
        ("016_S_6802", "bl"),
        ("016_S_6816", "bl"),
        ("126_S_4891", "m84"),
        # Multiple images
        ("029_S_2395", "m72"),
    ]

    # Removing known exceptions from images to convert
    if not fmri_df.empty:
        error_ind = fmri_df.index[fmri_df.apply(lambda x: (
            (x.Subject_ID, x.VISCODE) in conversion_errors),
                                                axis=1)]
        fmri_df.drop(error_ind, inplace=True)

    # Checking for images paths in filesystem
    images = find_image_path(fmri_df, source_dir, "fMRI", "S", "Series_ID")
    images.to_csv(path.join(conversion_dir, "fmri_paths.tsv"),
                  sep="\t",
                  index=False)

    return images