Beispiel #1
0
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
Beispiel #2
0
 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()
Beispiel #4
0
    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))
Beispiel #5
0
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)
Beispiel #6
0
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]
Beispiel #7
0
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}.")
Beispiel #8
0
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
Beispiel #9
0
    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))
Beispiel #10
0
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)
Beispiel #11
0
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
Beispiel #12
0
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)
Beispiel #13
0
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