def get_subject_session_list(input_dir, ss_file=None, is_bids_dir=True, use_session_tsv=False, tsv_dir=None): """Parse a BIDS or CAPS directory to get the subjects and sessions. This function lists all the subjects and sessions based on the content of the BIDS or CAPS directory or (if specified) on the provided subject-sessions TSV file. Args: input_dir: A BIDS or CAPS directory path. ss_file: A subjects-sessions file (.tsv format). is_bids_dir: Indicates if input_dir is a BIDS or CAPS directory use_session_tsv (boolean): Specify if the list uses the sessions listed in the sessions.tsv files tsv_dir (str): if TSV file does not exist, it will be created in output_dir. If not specified, output_dir will be in <tmp> folder Returns: subjects: A subjects list. sessions: A sessions list. Notes: This is a generic method based on folder names. If your <BIDS> dataset contains e.g.: - sub-CLNC01/ses-M00/anat/sub-CLNC01_ses-M00_T1w.nii - sub-CLNC02/ses-M00/dwi/sub-CLNC02_ses-M00_dwi.{bval|bvec|json|nii} - sub-CLNC02/ses-M00/anat/sub-CLNC02_ses-M00_T1w.nii get_subject_session_list(<BIDS>, None, True) will return ['ses-M00', 'ses-M00'], ['sub-CLNC01', 'sub-CLNC02']. However, if your pipeline needs both T1w and DWI files, you will need to check with e.g. clinica_file_reader_function. """ import os import tempfile from time import localtime, strftime, time import clinica.iotools.utils.data_handling as cdh if not ss_file: if tsv_dir: output_dir = tsv_dir else: output_dir = tempfile.mkdtemp() timestamp = strftime("%Y%m%d_%H%M%S", localtime(time())) tsv_file = f"subjects_sessions_list_{timestamp}.tsv" ss_file = os.path.join(output_dir, tsv_file) cdh.create_subs_sess_list( input_dir=input_dir, output_dir=output_dir, file_name=tsv_file, is_bids_dir=is_bids_dir, use_session_tsv=use_session_tsv, ) participant_ids, session_ids = read_participant_tsv(ss_file) return session_ids, participant_ids
def run_command(self, args): import os import errno from clinica.iotools.utils import data_handling as dt output_directory = os.path.dirname(args.out_tsv) if not os.path.exists(output_directory): try: os.makedirs(output_directory) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise dt.create_subs_sess_list(args.bids_directory, output_directory, os.path.basename(args.out_tsv))
def run_command(self, args): """ """ from tempfile import mkdtemp from clinica.pipelines.dwi_preprocessing_multi_shell.dwi_preprocessing_multi_shell_pipeline import DwiPreprocessingMultiShell import os import errno from clinica.iotools.utils.data_handling import create_subs_sess_list from nipype import config cfg = dict(execution={'parameterize_dirs': False}) config.update_config(cfg) if args.subjects_sessions_tsv is None: try: temp_dir = mkdtemp() except OSError as exception: if exception.errno != errno.EEXIST: raise create_subs_sess_list(args.bids_directory, temp_dir) args.subjects_sessions_tsv = os.path.join(temp_dir, 'subjects_sessions_list.tsv') pipeline = DwiPreprocessingNoddi( bids_directory=self.absolute_path(args.bids_directory), caps_directory=self.absolute_path(args.caps_directory), tsv_file=self.absolute_path(args.subjects_sessions_tsv)) pipeline.parameters = { 'epi_param': dict( [ ('echospacing', args.echo_spacing), ('acc_factor', args.acceleration_factor), ('enc_dir', args.phase_encoding_direction), ('epi_factor', args.epi_factor) ]), 'alt_epi_params': dict( [ ('echospacing', args.echo_spacing), ('acc_factor', args.acceleration_factor), ('enc_dir_alt', args.phase_encoding_direction_alternative), ('epi_factor', args.epi_factor) ]) } if args.working_directory is None: args.working_directory = mkdtemp() pipeline.base_dir = self.absolute_path(args.working_directory) if args.n_procs: pipeline.run(plugin='MultiProc', plugin_args={'n_procs': args.n_procs}) else: pipeline.run()
def run_command(self, args): import os from clinica.iotools.utils import data_handling as dt from clinica.utils.inputs import check_bids_folder from clinica.utils.stream import cprint check_bids_folder(args.bids_directory) output_directory = os.path.dirname(os.path.abspath(args.out_tsv)) os.makedirs(output_directory, exist_ok=True) dt.create_subs_sess_list(args.bids_directory, output_directory, os.path.basename(args.out_tsv)) cprint("The TSV file was saved to %s" % os.path.abspath(args.out_tsv))
def run_createsubjectsession( input_dir: PathLike, output_dir: PathLike, ref_dir: PathLike ) -> None: from clinica.iotools.utils import data_handling as dt # Arrage tsv_name = "subject_session_list.tsv" # Act - Create subject_session file dt.create_subs_sess_list(input_dir / "bids", output_dir, tsv_name) # Assert out_tsv = fspath(output_dir / tsv_name) ref_tsv = fspath(ref_dir / tsv_name) assert identical_subject_list(out_tsv, ref_tsv)
def get_subject_session_list(input_dir, ss_file=None, is_bids_dir=True, use_session_tsv=False): """Parses a BIDS or CAPS directory to get the subjects and sessions. This function lists all the subjects and sessions based on the content of the BIDS or CAPS directory or (if specified) on the provided subject-sessions TSV file. Args: input_dir: A BIDS or CAPS directory path. ss_file: A subjects-sessions file (.tsv format). is_bids_dir: Indicates if input_dir is a BIDS or CAPS directory use_session_tsv (boolean): Specify if the list uses the sessions listed in the sessions.tsv files Returns: subjects: A subjects list. sessions: A sessions list. """ import clinica.iotools.utils.data_handling as cdh import pandas as pd import tempfile from time import time, strftime, localtime import os if not ss_file: output_dir = tempfile.mkdtemp() timestamp = strftime('%Y%m%d_%H%M%S', localtime(time())) tsv_file = '%s_subjects_sessions_list.tsv' % timestamp ss_file = os.path.join(output_dir, tsv_file) cdh.create_subs_sess_list(input_dir=input_dir, output_dir=output_dir, file_name=tsv_file, is_bids_dir=is_bids_dir, use_session_tsv=use_session_tsv) ss_df = pd.io.parsers.read_csv(ss_file, sep='\t') if 'participant_id' not in list(ss_df.columns.values): raise Exception('No participant_id column in TSV file.') if 'session_id' not in list(ss_df.columns.values): raise Exception('No session_id column in TSV file.') subjects = list(ss_df.participant_id) sessions = list(ss_df.session_id) # Remove potential whitespace in participant_id or session_id return [ses.strip(' ') for ses in sessions], [sub.strip(' ') for sub in subjects]
def create_subjects_visits(bids_directory: str, output_tsv: str) -> None: """Export participants with their sessions.""" from os import makedirs from os.path import basename, dirname from clinica.iotools.utils.data_handling import create_subs_sess_list from clinica.utils.inputs import check_bids_folder from clinica.utils.stream import cprint check_bids_folder(bids_directory) output_directory = dirname(output_tsv) makedirs(output_directory, exist_ok=True) create_subs_sess_list(bids_directory, output_directory, basename(output_tsv)) cprint(f"The TSV file was saved to {output_tsv}.")
def load_and_check_tsv(tsv_path, caps_dir, output_path): import pandas as pd from os.path import join from clinica.iotools.utils.data_handling import create_subs_sess_list if tsv_path is not None: df = pd.read_csv(tsv_path, sep='\t') if ('session_id' not in list(df.columns.values)) or ( 'participant_id' not in list(df.columns.values)): raise Exception("the data file is not in the correct format." "Columns should include ['participant_id', 'session_id']") else: create_subs_sess_list(caps_dir, output_path, is_bids_dir=False, use_session_tsv=False) df = pd.read_csv(join(output_path, 'subjects_sessions_list.tsv'), sep="\t") return df
def run_command(self, args): import os import errno from clinica.iotools.utils import data_handling as dt from clinica.utils.stream import cprint from clinica.utils.inputs import check_bids_folder check_bids_folder(args.bids_directory) output_directory = os.path.dirname(os.path.abspath(args.out_tsv)) if not os.path.exists(output_directory): try: os.makedirs(output_directory) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise dt.create_subs_sess_list(args.bids_directory, output_directory, os.path.basename(args.out_tsv)) cprint("The TSV file was saved to %s" % os.path.abspath(args.out_tsv))
def test_run_CreateSubjectSessionList(cmdopt): from os.path import join, dirname, abspath from os import remove from clinica.iotools.utils import data_handling as dt root = join(dirname(abspath(__file__)), pardir, 'data', 'CreateSubjectSessionList') # Set variables bids_directory = join(root, 'in', 'bids') output_directory = join(root, 'out') tsv_name = 'subject_session_list.tsv' # Create subject_session file dt.create_subs_sess_list(bids_directory, output_directory, tsv_name) # Comparison bitwise out_tsv = join(output_directory, tsv_name) ref_tsv = join(root, 'ref', tsv_name) assert identical_subject_list(out_tsv, ref_tsv) remove(out_tsv)
def load_and_check_tsv(tsv_path, caps_dict, output_path): from os.path import join import pandas as pd from clinica.iotools.utils.data_handling import create_subs_sess_list from clinicadl.utils.caps_dataset.data import check_multi_cohort_tsv if tsv_path is not None: if len(caps_dict) == 1: df = pd.read_csv(tsv_path, sep="\t") if ("session_id" not in list( df.columns.values)) or ("participant_id" not in list( df.columns.values)): raise Exception( "the data file is not in the correct format." "Columns should include ['participant_id', 'session_id']") else: tsv_df = pd.read_csv(tsv_path, sep="\t") check_multi_cohort_tsv(tsv_df, "labels") df = pd.DataFrame() for idx in range(len(tsv_df)): cohort_name = tsv_df.loc[idx, "cohort"] cohort_path = tsv_df.loc[idx, "path"] cohort_df = pd.read_csv(cohort_path, sep="\t") cohort_df["cohort"] = cohort_name df = pd.concat([df, cohort_df]) else: df = pd.DataFrame() for cohort, caps_path in caps_dict.items(): create_subs_sess_list(caps_path, output_path, is_bids_dir=False, use_session_tsv=False) cohort_df = pd.read_csv(join(output_path, "subjects_sessions_list.tsv"), sep="\t") cohort_df["cohort"] = cohort df = pd.concat([df, cohort_df]) return df
def test_run_CreateSubjectSessionList(cmdopt): from os import remove from os.path import abspath, dirname, join from clinica.iotools.utils import data_handling as dt root = join(dirname(abspath(__file__)), pardir, pardir, "data", "CreateSubjectSessionList") # Set variables bids_directory = join(root, "in", "bids") output_directory = join(root, "out") tsv_name = "subject_session_list.tsv" # Create subject_session file dt.create_subs_sess_list(bids_directory, output_directory, tsv_name) # Comparison bitwise out_tsv = join(output_directory, tsv_name) ref_tsv = join(root, "ref", tsv_name) assert identical_subject_list(out_tsv, ref_tsv) remove(out_tsv)
def grab_noddi_preprocessed_files(caps_directory, tsv): """ This is a function to grab the files from the preprocessed data Args: caps_directory: tsv: Returns: """ import os import csv import tempfile from time import time, strftime, localtime import clinica.iotools.utils.data_handling as cdh if tsv is None: output_dir = tempfile.mkdtemp() timestamp = strftime('%Y%m%d_%H%M%S', localtime(time())) tsv_file = '%s_subjects_sessions_list.tsv' % timestamp tsv = os.path.join(output_dir, tsv_file) cdh.create_subs_sess_list(input_dir=caps_directory, output_dir=output_dir, file_name=tsv_file, is_bids_dir=False) subject_list = [] session_list = [] subject_id_list = [] with open(tsv, 'rb') as tsvin: tsv_reader = csv.reader(tsvin, delimiter='\t') for row in tsv_reader: if row[0] == 'participant_id': continue else: subject_list.append(row[0]) session_list.append(row[1]) subject_id_list.append((row[0] + '_' + row[1])) caps_directory = os.path.expanduser(caps_directory) noddi_preprocessed_dwi = [] noddi_preprocessed_bvec = [] noddi_preprocessed_bval = [] noddi_preprocessed_mask = [] # the number of subject_list and session_list should be the same try: len(subject_list) == len(session_list) except RuntimeError: print "It seems that the nuber of session_list and subject_list are not in the same length, please check" raise num_subject = len(subject_list) for i in xrange(num_subject): # AP subject_nii = os.path.join( caps_directory, 'subjects', subject_list[i], session_list[i], 'dwi', 'preprocessing', subject_id_list[i] + '_dwi_space-b0_preproc.nii.gz') noddi_preprocessed_dwi += [subject_nii] subject_bvec = os.path.join( caps_directory, 'subjects', subject_list[i], session_list[i], 'dwi', 'preprocessing', subject_id_list[i] + '_dwi_space-b0_preproc.bvec') noddi_preprocessed_bvec += [subject_bvec] subject_bval = os.path.join( caps_directory, 'subjects', subject_list[i], session_list[i], 'dwi', 'preprocessing', subject_id_list[i] + '_dwi_space-b0_preproc.bval') noddi_preprocessed_bval += [subject_bval] subject_mask = os.path.join( caps_directory, 'subjects', subject_list[i], session_list[i], 'dwi', 'preprocessing', subject_id_list[i] + '_dwi_space-b0_brainmask.nii.gz') noddi_preprocessed_mask += [subject_mask] return subject_id_list, noddi_preprocessed_dwi, noddi_preprocessed_bvec, noddi_preprocessed_bval, noddi_preprocessed_mask