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