From dadb89ae870d17d4c2236b809d3dfd4550fefd4e Mon Sep 17 00:00:00 2001 From: Alexandre Routier Date: Mon, 10 Aug 2020 10:36:37 +0200 Subject: [PATCH 1/6] Raise Exception if AIBL dependancies are not present --- .../aibl_to_bids/aibl_to_bids_cli.py | 53 ++++++------------- 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/clinica/iotools/converters/aibl_to_bids/aibl_to_bids_cli.py b/clinica/iotools/converters/aibl_to_bids/aibl_to_bids_cli.py index 7bfed84d1..b7fbf759e 100644 --- a/clinica/iotools/converters/aibl_to_bids/aibl_to_bids_cli.py +++ b/clinica/iotools/converters/aibl_to_bids/aibl_to_bids_cli.py @@ -4,23 +4,16 @@ class AiblToBidsCLI(ce.CmdParser): - """ - todo:add description - """ - def define_name(self): - """Define the sub-command name to run this pipelines. - """ + """Define the sub-command name to run this pipeline.""" self._name = 'aibl-to-bids' def define_description(self): - """Define a description of this pipeline. - """ - self._description = 'Convert AIBL (https://aibl.csiro.au/adni/index.html”) into BIDS.' + """Define a description of this pipeline.""" + self._description = 'Convert AIBL (https://aibl.csiro.au/adni/index.html) into BIDS.' def define_options(self): - """Define the sub-command arguments - """ + """Define the sub-command arguments.""" self._args.add_argument("dataset_directory", help='Path to the AIBL images directory.') self._args.add_argument("clinical_data_directory", @@ -29,36 +22,20 @@ def define_options(self): help='Path to the BIDS directory.') def run_command(self, args): - from clinica.iotools.converters.aibl_to_bids.aibl_to_bids import convert_clinical_data, convert_images - from clinica.utils.stream import cprint from os.path import exists from os import makedirs from colorama import Fore - from clinica.iotools.converter_utils import check_bin - import sys - - # Check existence of binaries dcm2nii, dcm2niix and mri_convert - # If they are not found we warn the user and tell him that the bin - # were not foud. He then has the possibility to run the converter anyway - missing_bin = 0 - bin_to_test = ['dcm2nii', 'dcm2niix', 'mri_convert'] - for binary in bin_to_test: - missing_bin = missing_bin + check_bin(binary) - if missing_bin > 0: - cprint(Fore.RED + str(missing_bin) + ' binary(es) is (are) missing. ' - + 'Most important are : dcm2nii and dcm2niix.' + Fore.RESET) - while True: - cprint('Do you still want to run the converter ? (yes/no): ') - answer = input('') - if answer.lower() in ['yes', 'no']: - break - else: - cprint('Possible answers are yes or no.\n') - if answer.lower() == 'yes': - cprint('Running the pipeline anyway.') - if answer.lower() == 'no': - cprint('Exiting clinica...') - sys.exit() + from clinica.iotools.converters.aibl_to_bids.aibl_to_bids import convert_clinical_data, convert_images + from clinica.utils.check_dependency import is_binary_present, check_freesurfer + from clinica.utils.exceptions import ClinicaMissingDependencyError + + list_binaries = ['dcm2niix', 'dcm2nii'] + for binary in list_binaries: + if not is_binary_present(binary): + raise ClinicaMissingDependencyError( + '%s\n[Error] Clinica could not find %s software: it is not present in your ' + 'PATH environment.%s' % (Fore.RED, binary, Fore.RESET)) + check_freesurfer() if not exists(args.bids_directory): makedirs(args.bids_directory) From b390a858a3f07b2cd5b62c4a48c341849d71951e Mon Sep 17 00:00:00 2001 From: Alexandre Routier Date: Mon, 10 Aug 2020 12:33:23 +0200 Subject: [PATCH 2/6] Use regexp to grab CSV files Fixes #108. When new clinical data are available, a folder Data_extract_X.Y.Z is downloaded. Within this folder, each CSV file finishes with the date (e.g. aibl_flutemeta_01-Jun-2018.csv). This commit removes hard-coded date for AIBL. --- .../converters/aibl_to_bids/aibl_to_bids.py | 9 ----- .../converters/aibl_to_bids/aibl_utils.py | 39 +++++++++---------- 2 files changed, 18 insertions(+), 30 deletions(-) diff --git a/clinica/iotools/converters/aibl_to_bids/aibl_to_bids.py b/clinica/iotools/converters/aibl_to_bids/aibl_to_bids.py index 5ab170624..4cdeeebe6 100644 --- a/clinica/iotools/converters/aibl_to_bids/aibl_to_bids.py +++ b/clinica/iotools/converters/aibl_to_bids/aibl_to_bids.py @@ -4,15 +4,6 @@ Convert the AIBL dataset (http://www.aibl.csiro.au/) into BIDS. """ -__author__ = "Simona Bottani" -__copyright__ = "Copyright 2016-2019 The Aramis Lab Team" -__credits__ = ["Simona Bottani"] -__license__ = "See LICENSE.txt file" -__version__ = "0.1.0" -__maintainer__ = "Simona Bottani" -__email__ = "simona.bottani@icm-institute.org" -__status__ = "Development" - def convert_images(path_to_dataset, path_to_csv, bids_dir): diff --git a/clinica/iotools/converters/aibl_to_bids/aibl_utils.py b/clinica/iotools/converters/aibl_to_bids/aibl_utils.py index 989c644a5..4a4807a51 100644 --- a/clinica/iotools/converters/aibl_to_bids/aibl_utils.py +++ b/clinica/iotools/converters/aibl_to_bids/aibl_utils.py @@ -4,15 +4,6 @@ Utils to convert AIBL dataset in BIDS """ -__author__ = "Simona Bottani" -__copyright__ = "Copyright 2016-2019 The Aramis Lab Team" -__credits__ = ["Simona Bottani"] -__license__ = "See LICENSE.txt file" -__version__ = "0.1.0" -__maintainer__ = "Simona Bottani" -__email__ = "simona.bottani@icm-institute.org" -__status__ = "Development" - def listdir_nohidden(path): """ @@ -463,10 +454,11 @@ def find_path_to_T1(path_to_dataset, path_to_csv): """ import os import pandas + import glob # two csv_files contain information regarding the T1w MRI images - mri_meta = pandas.read_csv(os.path.join(path_to_csv, "aibl_mrimeta_28-Apr-2015.csv")) - mri_3meta = pandas.read_csv(os.path.join(path_to_csv, "aibl_mri3meta_28-Apr-2015.csv")) + mri_meta = pandas.read_csv(glob.glob(os.path.join(path_to_csv, "aibl_mrimeta_*.csv"))[0]) + mri_3meta = pandas.read_csv(glob.glob(os.path.join(path_to_csv, "aibl_mri3meta_*.csv"))[0]) file_mri = [mri_meta, mri_3meta] subjects_ID = listdir_nohidden(path_to_dataset) # list of all the folders which correspond to the subject_ID @@ -508,6 +500,7 @@ def paths_to_bids(path_to_dataset, path_to_csv, bids_dir, modality): from clinica.utils.stream import cprint from multiprocessing.dummy import Pool from multiprocessing import cpu_count, Value + import glob if modality.lower() not in ['t1', 'av45', 'flute', 'pib']: # This should never be reached @@ -569,8 +562,10 @@ def create_file(image): if modality == 't1': images = find_path_to_T1(path_to_dataset, path_to_csv) else: - path_to_csv_pet_modality = join(path_to_csv, 'aibl_' + modality - + 'meta_28-Apr-2015.csv') + path_to_csv_pet_modality = glob.glob(join( + path_to_csv, 'aibl_' + modality + 'meta_*.csv') + )[0] + cprint(path_to_csv_pet_modality) if not exists(path_to_csv_pet_modality): raise FileNotFoundError(path_to_csv_pet_modality + ' file not found in clinical data folder') @@ -801,18 +796,20 @@ def create_sessions_dict_AIBL(input_path, clinical_data_dir, clinical_spec_path) def get_examdates(rid, examdates, viscodes, clinical_data_dir): - + import glob from os import path from datetime import datetime from dateutil.relativedelta import relativedelta import pandas as pd res_examdates = [] - csv_list = ('aibl_mri3meta_28-Apr-2015.csv', - 'aibl_mrimeta_28-Apr-2015.csv', - 'aibl_cdr_28-Apr-2015.csv', - 'aibl_flutemeta_28-Apr-2015.csv', - 'aibl_mmse_28-Apr-2015.csv', - 'aibl_pibmeta_28-Apr-2015.csv') + csv_list = [ + glob.glob(path.join(clinical_data_dir, 'aibl_mri3meta_*.csv'))[0], + glob.glob(path.join(clinical_data_dir, 'aibl_mrimeta_*.csv'))[0], + glob.glob(path.join(clinical_data_dir, 'aibl_cdr_*.csv'))[0], + glob.glob(path.join(clinical_data_dir, 'aibl_flutemeta_*.csv'))[0], + glob.glob(path.join(clinical_data_dir, 'aibl_mmse_*.csv'))[0], + glob.glob(path.join(clinical_data_dir, 'aibl_pibmeta_*.csv'))[0] + ] for e in range(len(examdates)): exam = examdates[e] @@ -823,7 +820,7 @@ def get_examdates(rid, examdates, viscodes, clinical_data_dir): # If EXAMDATE does not exist (-4) we try to obtain it from another .csv file for csv_file in csv_list: - csv_data = pd.read_csv(path.join(clinical_data_dir, csv_file), low_memory=False) + csv_data = pd.read_csv(csv_file, low_memory=False) exam_date = csv_data[(csv_data.RID == rid) & (csv_data.VISCODE == viscodes[e])] if not exam_date.empty and exam_date.iloc[0].EXAMDATE != '-4': exam = exam_date.iloc[0].EXAMDATE From 6bbb5bff6f68cf0c1d5f5604378c4648ca4dcdfd Mon Sep 17 00:00:00 2001 From: Alexandre Routier Date: Mon, 10 Aug 2020 14:29:40 +0200 Subject: [PATCH 3/6] Use * instead of hard-coded data for AIBL resources --- ...l_data_bids_correspondence_participant.tsv | 20 +++++++++--------- ...ical_data_bids_correspondence_sessions.tsv | 16 +++++++------- .../iotools/data/clinical_specifications.xlsx | Bin 51954 -> 51923 bytes 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_participant.tsv b/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_participant.tsv index 41e9a3392..09f458154 100644 --- a/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_participant.tsv +++ b/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_participant.tsv @@ -1,20 +1,20 @@ Description BIDS CLINICA BIDS format BIDS type Comments INSIGHT INSIGHT location CLIN-AD CLINAD location ADNI ADNI location AIBL AIBL location OASIS OASIS location CAPP CAPP location PREVDEMALS PREVDEMALS location NIFD NIFD location BIDS id of the participant participant_id Keyword 'sub-' followed by one of the original subject IDs without special characters or symbols string LONI_ID NIFD_Clinical_Data_2017_final_updated.xlsx -Second participant id alternative_id_1 Free format string PAT_INSIGHT_ID SocioDemog NIP RETROMIL AM v16_reduced.xlsx/Données PTID ADNIMERGE.csv RID aibl_pdxconv_28-Apr-2015.csv ID oasis_cross-sectional.csv Identifiant CATI 2016.07.04_CAPP_Database/M0 Inclusion Number Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ +Second participant id alternative_id_1 Free format string PAT_INSIGHT_ID SocioDemog NIP RETROMIL AM v16_reduced.xlsx/Données PTID ADNIMERGE.csv RID aibl_pdxconv_*.csv ID oasis_cross-sectional.csv Identifiant CATI 2016.07.04_CAPP_Database/M0 Inclusion Number Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ Third participant id alternative_id_2 Free format string PAT_MEMENTO_ID SocioDemog Identifiant CLINACT 2016.07.04_CAPP_Database/M0 Fourth participant id alternative_id_3 Free format string Identifiant TEP 2016.07.04_CAPP_Database/M0 -Date of birth date_of_birth YYYY-MM-DD HH:MM:SS string HH:MM:SS optional PAT_DATE_NAISSANCE SocioDemog DDN RETROMIL AM v16_reduced.xlsx/Données X PTDOB aibl_ptdemog_28-Apr-2015.csv Date de naissance 2016.07.04_CAPP_Database/M0 DOB Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ DOB NIFD_Clinical_Data_2017_final_updated.xlsx -Sex sex M or F char PAT_SEXE SocioDemog Gender RETROMIL AM v16_reduced.xlsx/Données PTGENDER ADNIMERGE.csv PTGENDER aibl_ptdemog_28-Apr-2015.csv M/F oasis_cross-sectional.csv Sexe 2016.07.04_CAPP_Database/M0 Sex (F/M) Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ GENDER NIFD_Clinical_Data_2017_final_updated.xlsx +Date of birth date_of_birth YYYY-MM-DD HH:MM:SS string HH:MM:SS optional PAT_DATE_NAISSANCE SocioDemog DDN RETROMIL AM v16_reduced.xlsx/Données X PTDOB aibl_ptdemog_*.csv Date de naissance 2016.07.04_CAPP_Database/M0 DOB Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ DOB NIFD_Clinical_Data_2017_final_updated.xlsx +Sex sex M or F char PAT_SEXE SocioDemog Gender RETROMIL AM v16_reduced.xlsx/Données PTGENDER ADNIMERGE.csv PTGENDER aibl_ptdemog_*.csv M/F oasis_cross-sectional.csv Sexe 2016.07.04_CAPP_Database/M0 Sex (F/M) Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ GENDER NIFD_Clinical_Data_2017_final_updated.xlsx Educational level education_level Free format string PAT_EDUCATION SocioDemog N années d'études RETROMIL AM v16_reduced.xlsx/Données PTEDUCAT ADNIMERGE.csv Educ oasis_cross-sectional.csv etude 2016.07.04_CAPP_Database/M0 Niveau Educatif Fichier PrevDemAls suivi-14_04_2017.xlsx/1ere extract datas Paris_Mariem EDUCATION NIFD_Clinical_Data_2017_final_updated.xlsx Deceased deceased Y or N char PAT_DECES SocioDemog X -Age in years age_bl In years with, possibly, decimals float PAT_AGE_INCLUSION SocioDemog X Age oasis_cross-sectional.csv Age at inclusion Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ +Age in years age_bl "In years with, possibly, decimals" float PAT_AGE_INCLUSION SocioDemog X Age oasis_cross-sectional.csv Age at inclusion Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ Marital status marital_status Free format string PAT_CIVIL_STATUT SocioDemog PTMARRY ADNIMERGE.csv -Site in which the patient was studied site Free format string SITE ADNIMERGE.csv SITEID aibl_ptdemog_28-Apr-2015.csv Centre 2016.07.04_CAPP_Database/M0 SITE NIFD_Clinical_Data_2017_final_updated.xlsx -APOE (number of E4 alleles) apoe4 "Number: 0; 1; 2 (number of E4 alleles)" int APOE4 ADNIMERGE.csv -Genotype (Allele 1) apoe_gen1 "Number: 2; 3; 4" int APGEN1 APOERES.csv APGEN1 aibl_apoeres_28-Apr-2015.csv -Genotype (Allele 2) apoe_gen2 "Number: 2; 3; 4" int APGEN2 APOERES.csv APGEN2 aibl_apoeres_28-Apr-2015.csv -Laterality of the subject laterality Free format string X Hand oasis_cross-sectional.csv Laterality (D=Right, G=Left) Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ +Site in which the patient was studied site Free format string SITE ADNIMERGE.csv SITEID aibl_ptdemog_*.csv Centre 2016.07.04_CAPP_Database/M0 SITE NIFD_Clinical_Data_2017_final_updated.xlsx +APOE (number of E4 alleles) apoe4 Number: 0; 1; 2 (number of E4 alleles) int APOE4 ADNIMERGE.csv +Genotype (Allele 1) apoe_gen1 Number: 2; 3; 4 int APGEN1 APOERES.csv APGEN1 aibl_apoeres_*.csv +Genotype (Allele 2) apoe_gen2 Number: 2; 3; 4 int APGEN2 APOERES.csv APGEN2 aibl_apoeres_*.csv +Laterality of the subject laterality Free format string X Hand oasis_cross-sectional.csv "Laterality (D=Right, G=Left)" Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ Date of inclusion inclusion_date YYYY-MM-DD HH:MM:SS string HH:MM:SS optional Date of inclusion Fichier PrevDemAls suivi-14_04_2017.xlsx/Fichier PrevDemAls suivi-10_03_ Digit roster ID (unique ID of the participant which is composed with site ID to form the participant ID) adni_rid Number 4 digits int RID ADNIMERGE.csv -Protocol from which the subject originated adni_original_study "Free format: ADNI1; ADNI2; ADNI3; ADNIGO" string ORIGPROT ADNIMERGE.csv +Protocol from which the subject originated adni_original_study Free format: ADNI1; ADNI2; ADNI3; ADNIGO string ORIGPROT ADNIMERGE.csv Diagnosis not necessarily at bl diagnosis Free format string Used when only one diagnosis exists for a given patient DX NIFD_Clinical_Data_2017_final_updated.xlsx \ No newline at end of file diff --git a/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_sessions.tsv b/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_sessions.tsv index aabcbf679..d5bf9795c 100644 --- a/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_sessions.tsv +++ b/clinica/iotools/converters/clinical_data_bids_correspondence/clinical_data_bids_correspondence_sessions.tsv @@ -1,13 +1,13 @@ Field BIDS CLINICA BIDS format BIDS type Comments INSIGHT INSIGHT location CLINAD CLINAD location ADNI ADNI location AIBL AIBL location CAPP PREVDEMALS PREVDEMALS location NIFD NIFD location BIDS session id session_id Keyword 'ses-' followed by the original session id of each dataset without special characters or symbols string Date of the examination examination_date YYYY-MM-DD HH:MM:SS string date d'evaluation RETROMIL AM v16_reduced.xlsx/Données EXAMDATE ADNIMERGE.csv/ADNIMERGE -Age at the session age In years with, possibly, decimals float age at session RETROMIL AM v16_reduced.xlsx/Données AGE ADNIMERGE.csv/ADNIMERGE +Age at the session age "In years with, possibly, decimals" float age at session RETROMIL AM v16_reduced.xlsx/Données AGE ADNIMERGE.csv/ADNIMERGE Current Diagnosis diagnosis Free format string DXCURREN DXSUM_PDXCONV_ADNIALL.csv Clinica Dementia Rate sum of boxes cdr_sb Number float CDRSB ADNIMERGE.csv/ADNIMERGE CDR_BOX_SCORE NIFD_Clinical_Data_2017_final_updated.xlsx -Clinica Dementia Rate Global cdr_global "Number: 0;0.5;1;2;3" float CDGLOBAL CDR.csv CDR_TOT NIFD_Clinical_Data_2017_final_updated.xlsx +Clinica Dementia Rate Global cdr_global Number: 0;0.5;1;2;3 float CDGLOBAL CDR.csv CDR_TOT NIFD_Clinical_Data_2017_final_updated.xlsx AD Assessment Scale - 11 adas11 Number float ADAS11 ADNIMERGE.csv/ADNIMERGE AD Assessment Scale - 13 adas13 Number float ADAS13 ADNIMERGE.csv/ADNIMERGE -Mini-mental state exam MMSE Number int maximum value is 30 MMS RETROMIL AM v16_reduced.xlsx/Données MMSE ADNIMERGE.csv/ADNIMERGE MMSCORE aibl_mmse_28-Apr-2015.csv Score MMS Fichier PrevDemAls suivi-14_04_2017.xlsx/1ere extract datas Paris_Mariem MMSE_TOT NIFD_Clinical_Data_2017_final_updated.xlsx +Mini-mental state exam MMSE Number int maximum value is 30 MMS RETROMIL AM v16_reduced.xlsx/Données MMSE ADNIMERGE.csv/ADNIMERGE MMSCORE aibl_mmse_*.csv Score MMS Fichier PrevDemAls suivi-14_04_2017.xlsx/1ere extract datas Paris_Mariem MMSE_TOT NIFD_Clinical_Data_2017_final_updated.xlsx Functional Activities Questionnaires FAQ Number float FAQ ADNIMERGE.csv/ADNIMERGE FAQ_TOTAL NIFD_Clinical_Data_2017_final_updated.xlsx Diagnosis at current session diagnosis DX ADNIMERGE.csv/ADNIMERGE Rey's Auditory Verbal Learning Test - immediate ravlt_immediate Number int RAVLT_immediate ADNIMERGE.csv/ADNIMERGE @@ -47,11 +47,11 @@ AD Assessment scale - Aggregate memory subscore adas_memory Number adas_Q1 + ada AD Assessment scale - Aggregate language subscore adas_language Number adas_Q2 + adas_Q5 + adas_Q10 + adas_Q11 + adas_Q12 maximum value is 25 AD Assessment scale - Aggregate concentration subscore adas_concentration Number adas_Q13 maximum value is 10 AD Assessment scale - Aggregate praxis subscore adas_praxis Number adas_Q3 + adas_Q6 maximum value is 5 -Protocol under which data was collected adni_current_study "free format: ADNI1; ADNI2; ADNI3; ADNIGO" string COLPROT ADNIMERGE.csv/ADNIMERGE -Code for change in diagnosis adni_diagnosis_change "Number: 1 (stable CN) ; 2 (stable MCI); 3 (stable AD); 4 (CN to MCI): 5 (MCI to AD); 6 (CN to AD); 7 (MCI to CN); 8 (AD to MCI); 9 (AD to CN) " DXCHANGE DXSUM_PDXCONV_ADNIALL.csv -Average FDG-PET of angular, temporal and posterior cingulate adni_fdg Number float FDG ADNIMERGE.csv/ADNIMERGE -Average PIB SUVR of frontal cortex, anterior cingulate, precuneus cortex and parietal cortex adni_pib Number float PIB ADNIMERGE.csv/ADNIMERGE -Average AV45 SUVR of frontal, anterior cingulate, precuneus, and parietal cortex relative to cerebellum adni_av45 Number float AV45 ADNIMERGE.csv/ADNIMERGE +Protocol under which data was collected adni_current_study free format: ADNI1; ADNI2; ADNI3; ADNIGO string COLPROT ADNIMERGE.csv/ADNIMERGE +Code for change in diagnosis adni_diagnosis_change Number: 1 (stable CN) ; 2 (stable MCI); 3 (stable AD); 4 (CN to MCI): 5 (MCI to AD); 6 (CN to AD); 7 (MCI to CN); 8 (AD to MCI); 9 (AD to CN) DXCHANGE DXSUM_PDXCONV_ADNIALL.csv +"Average FDG-PET of angular, temporal and posterior cingulate" adni_fdg Number float FDG ADNIMERGE.csv/ADNIMERGE +"Average PIB SUVR of frontal cortex, anterior cingulate, precuneus cortex and parietal cortex" adni_pib Number float PIB ADNIMERGE.csv/ADNIMERGE +"Average AV45 SUVR of frontal, anterior cingulate, precuneus, and parietal cortex relative to cerebellum" adni_av45 Number float AV45 ADNIMERGE.csv/ADNIMERGE UCSF Ventricule Volume adni_ventricles_vol Number float Ventricles ADNIMERGE.csv/ADNIMERGE UCSF Hippocampus Volume adni_hippocampus_vol Number float Hippocampus ADNIMERGE.csv/ADNIMERGE UCSF Whole Brain Volume adni_brain_vol Number float Whole Brain ADNIMERGE.csv/ADNIMERGE diff --git a/clinica/iotools/data/clinical_specifications.xlsx b/clinica/iotools/data/clinical_specifications.xlsx index 280396b408808c4b623bdee6812f92e96d781a21..736f86fbb04373d59c8a9f7f2e9bccd320b1c1d4 100644 GIT binary patch literal 51923 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
  • +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 Date: Mon, 10 Aug 2020 14:39:23 +0200 Subject: [PATCH 4/6] Handle path to CSV files using regexp --- .../converters/aibl_to_bids/aibl_utils.py | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/clinica/iotools/converters/aibl_to_bids/aibl_utils.py b/clinica/iotools/converters/aibl_to_bids/aibl_utils.py index 4a4807a51..0b0aef931 100644 --- a/clinica/iotools/converters/aibl_to_bids/aibl_utils.py +++ b/clinica/iotools/converters/aibl_to_bids/aibl_utils.py @@ -565,12 +565,13 @@ def create_file(image): path_to_csv_pet_modality = glob.glob(join( path_to_csv, 'aibl_' + modality + 'meta_*.csv') )[0] - cprint(path_to_csv_pet_modality) if not exists(path_to_csv_pet_modality): raise FileNotFoundError(path_to_csv_pet_modality + ' file not found in clinical data folder') - # separator information : either ; or , - df_pet = pds.read_csv(path_to_csv_pet_modality, sep=',|;') + # Latest version of Flutemetamol CSV file (aibl_flutemeta_01-Jun-2018.csv) + # has an extra column for some rows. However, each CSV file (regarding PET tracers) + # contains the same columns. The usecols fixes this issue. + df_pet = pds.read_csv(path_to_csv_pet_modality, sep=',|;', usecols=list(range(0, 36))) images = find_path_to_pet_modality(path_to_dataset, df_pet) images.to_csv(join(bids_dir, modality + '_paths_aibl.tsv'), @@ -610,6 +611,7 @@ def create_participants_df_AIBL(input_path, clinical_spec_path, clinical_data_di from os import path import re import numpy as np + import glob fields_bids = ['participant_id'] fields_dataset = [] @@ -655,9 +657,9 @@ def create_participants_df_AIBL(input_path, clinical_spec_path, clinical_data_di file_to_read_path = path.join(clinical_data_dir, location) if file_ext == '.xlsx': - file_to_read = pd.read_excel(file_to_read_path, sheet_name=sheet) + file_to_read = pd.read_excel(glob.glob(file_to_read_path)[0], sheet_name=sheet) elif file_ext == '.csv': - file_to_read = pd.read_csv(file_to_read_path) + file_to_read = pd.read_csv(glob.glob(file_to_read_path)[0]) prev_location = location prev_sheet = sheet @@ -712,6 +714,7 @@ def create_sessions_dict_AIBL(input_path, clinical_data_dir, clinical_spec_path) """ import pandas as pd from os import path + import glob import numpy as np # Load data @@ -740,7 +743,7 @@ def create_sessions_dict_AIBL(input_path, clinical_data_dir, clinical_spec_path) tmp = field_location[i] location = tmp[0] file_to_read_path = path.join(clinical_data_dir, tmp) - files_to_read.append(file_to_read_path) + files_to_read.append(glob.glob(file_to_read_path)[0]) sessions_fields_to_read.append(sessions_fields[i]) rid = pd.read_csv(files_to_read[0], dtype={'text': str}, low_memory=False).RID @@ -820,7 +823,10 @@ def get_examdates(rid, examdates, viscodes, clinical_data_dir): # If EXAMDATE does not exist (-4) we try to obtain it from another .csv file for csv_file in csv_list: - csv_data = pd.read_csv(csv_file, low_memory=False) + if 'aibl_flutemeta' in csv_file: + csv_data = pd.read_csv(csv_file, low_memory=False, usecols=list(range(0, 36))) + else: + csv_data = pd.read_csv(csv_file, low_memory=False) exam_date = csv_data[(csv_data.RID == rid) & (csv_data.VISCODE == viscodes[e])] if not exam_date.empty and exam_date.iloc[0].EXAMDATE != '-4': exam = exam_date.iloc[0].EXAMDATE From 34ceb2288dd68f7b89836b89709f4dd811de711e Mon Sep 17 00:00:00 2001 From: Alexandre Routier Date: Mon, 10 Aug 2020 15:17:49 +0200 Subject: [PATCH 5/6] Set minimal version to Python 3.7 --- README.md | 2 +- environment.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b6b43702..e53f6aea4 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Clinica currently supports macOS and Linux. It can be installed: conda create --name clinicaEnv python=3.6 clinica -c Aramislab -c conda-forge ``` -- With `pip` (needs Python 3.6) +- With `pip` (needs Python 3.7) ```sh pip install clinica ``` diff --git a/environment.yml b/environment.yml index b90313735..b85166e6e 100644 --- a/environment.yml +++ b/environment.yml @@ -2,7 +2,7 @@ name: clinica_env channels: - defaults dependencies: - - python=3.6 + - python=3.7 - pip - pip: - -r requirements-dev.txt From b7a53788c111a77b2e50b9de0b9d35fd59096841 Mon Sep 17 00:00:00 2001 From: Mauricio DIAZ Date: Mon, 10 Aug 2020 16:21:43 +0200 Subject: [PATCH 6/6] Edit README file with new installation instructions --- README.md | 94 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index e53f6aea4..0060bd52a 100644 --- a/README.md +++ b/README.md @@ -40,18 +40,35 @@ ## About The Project -Clinica is a software platform for clinical research studies involving patients with neurological and psychiatric diseases and the acquisition of multimodal data (neuroimaging, clinical and cognitive evaluations, genetics...), most often with longitudinal follow-up. - -Clinica is command-line driven and written in Python. It uses the [Nipype](https://nipype.readthedocs.io/) system for pipelining and combines widely-used software packages for neuroimaging data analysis ([ANTs](http://stnava.github.io/ANTs/), [FreeSurfer](https://surfer.nmr.mgh.harvard.edu/), [FSL](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki), [MRtrix](https://www.mrtrix.org/), [PETPVC](https://github.com/UCL/PETPVC), [SPM](https://www.fil.ion.ucl.ac.uk/spm/)), machine learning ([Scikit-learn](https://scikit-learn.org/stable/)) and the [BIDS standard](http://bids-specification.readthedocs.io/) for data organization. - -Clinica provides tools to convert publicly available neuroimaging datasets into BIDS, namely: +Clinica is a software platform for clinical research studies involving patients +with neurological and psychiatric diseases and the acquisition of multimodal +data (neuroimaging, clinical and cognitive evaluations, genetics...), most +often with longitudinal follow-up. + +Clinica is command-line driven and written in Python. It uses the +[Nipype](https://nipype.readthedocs.io/) system for pipelining and combines +widely-used software packages for neuroimaging data analysis +([ANTs](http://stnava.github.io/ANTs/), +[FreeSurfer](https://surfer.nmr.mgh.harvard.edu/), +[FSL](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki), +[MRtrix](https://www.mrtrix.org/), [PETPVC](https://github.com/UCL/PETPVC), +[SPM](https://www.fil.ion.ucl.ac.uk/spm/)), machine learning +([Scikit-learn](https://scikit-learn.org/stable/)) and the [BIDS +standard](http://bids-specification.readthedocs.io/) for data organization. + +Clinica provides tools to convert publicly available neuroimaging datasets into +BIDS, namely: - [ADNI: Alzheimer’s Disease Neuroimaging Initiative](http://www.clinica.run/doc/Converters/ADNI2BIDS) - [AIBL: Australian Imaging, Biomarker & Lifestyle Flagship Study of Ageing](http://www.clinica.run/doc/Converters/AIBL2BIDS) - [NIFD: Neuroimaging in Frontotemporal Dementia](http://www.clinica.run/doc/Converters/NIFD2BIDS) - [OASIS: Open Access Series of Imaging Studies](http://www.clinica.run/doc/Converters/OASIS2BIDS) -Clinica can process any BIDS-compliant dataset with a set of complex processing pipelines involving different software packages for the analysis of neuroimaging data (T1-weighted MRI, diffusion MRI and PET data). It also provides integration between feature extraction and statistics, machine learning or deep learning. +Clinica can process any BIDS-compliant dataset with a set of complex processing +pipelines involving different software packages for the analysis of +neuroimaging data (T1-weighted MRI, diffusion MRI and PET data). It also +provides integration between feature extraction and statistics, machine +learning or deep learning. ![ClinicaPipelines](http://www.clinica.run/img/clinica_pipelines.png) @@ -59,7 +76,10 @@ Clinica can process any BIDS-compliant dataset with a set of complex processing Current pipelines are indicated in blue while new or updated pipelines are indicated in purple (will be released in Summer 2020).

    -Clinica is also showcased as a framework for the reproducible classification of Alzheimer's disease using [machine learning](https://github.com/aramis-lab/AD-ML) and [deep learning](https://github.com/aramis-lab/AD-DL). +Clinica is also showcased as a framework for the reproducible classification of +Alzheimer's disease using [machine +learning](https://github.com/aramis-lab/AD-ML) and [deep +learning](https://github.com/aramis-lab/AD-DL). @@ -67,32 +87,52 @@ Clinica is also showcased as a framework for the reproducible classification of > Full instructions for installation and additional information can be found in the [user documentation](http://www.clinica.run/doc). -Clinica currently supports macOS and Linux. It can be installed: +Clinica currently supports macOS and Linux. It can be installed by typing the +following command: -- With `conda` (recommended): ```sh -conda create --name clinicaEnv python=3.6 clinica -c Aramislab -c conda-forge +pip install clinica ``` -- With `pip` (needs Python 3.7) +To avoid conflicts with other versions of the dependency packages installed by +pip, it is strongly recommended to create a virtual environment before the +installation. For example, use +[Conda](https://docs.conda.io/en/latest/miniconda.html), to create a virtual +environment and activate it before installing clinica (you can also use +`virtualenv`): + ```sh -pip install clinica +conda create --name clinicaEnv python=3.7 +conda activate clinicaEnv ``` -- Using the [Developer installation](http://www.clinica.run/doc/Installation/#developer-installation) - -Depending on the pipeline that you want to use, you need to install pipeline-specific interfaces. Not all the dependencies are necessary to run Clinica. Please refer to this [page](http://www.clinica.run/doc/Third-party/) to determine which third-party libraries you need to install. +Depending on the pipeline that you want to use, you need to install +pipeline-specific interfaces. Not all the dependencies are necessary to run +Clinica. Please refer to this [page](http://www.clinica.run/doc/Third-party/) +to determine which third-party libraries you need to install. ## Example -Diagram illustrating the Clinica pipelines involved when performing a group comparison of FDG PET data projected on the cortical surface between patients with Alzheimer's disease and healthy controls from the ADNI database: +Diagram illustrating the Clinica pipelines involved when performing a group +comparison of FDG PET data projected on the cortical surface between patients +with Alzheimer's disease and healthy controls from the ADNI database: ![ClinicaExample](http://www.clinica.run/img/clinica_example.png) -1. Clinical and neuroimaging data are downloaded from the ADNI website and data are converted into BIDS with the [`adni-to-bids` converter](http://www.clinica.run/doc/Converters/ADNI2BIDS). -2. Estimation of the cortical and white surface is then produced by the [`t1-freesurfer` pipeline](http://www.clinica.run/doc/Pipelines/T1_FreeSurfer). -3. FDG PET data can be projected on the subject’s cortical surface and normalized to the FsAverage template from FreeSurfer using the [`pet-surface` pipeline](http://www.clinica.run/doc/Pipelines/PET_Surface). -4. TSV file with demographic information of the population studied is given to the [`statistics-surface` pipeline](http://www.clinica.run/doc/Pipelines/Stats_Surface) to generate the results of the group comparison. +1. Clinical and neuroimaging data are downloaded from the ADNI website and data + are converted into BIDS with the [`adni-to-bids` + converter](http://www.clinica.run/doc/Converters/ADNI2BIDS). +2. Estimation of the cortical and white surface is then produced by the + [`t1-freesurfer` + pipeline](http://www.clinica.run/doc/Pipelines/T1_FreeSurfer). +3. FDG PET data can be projected on the subject’s cortical surface and + normalized to the FsAverage template from FreeSurfer using the + [`pet-surface` pipeline](http://www.clinica.run/doc/Pipelines/PET_Surface). +4. TSV file with demographic information of the population studied is given to + the [`statistics-surface` + pipeline](http://www.clinica.run/doc/Pipelines/Stats_Surface) to generate + the results of the group comparison. -> For more examples and details, please refer to the [Documentation](http://www.clinica.run/doc/). +> For more examples and details, please refer to the +> [Documentation](http://www.clinica.run/doc/). @@ -100,7 +140,8 @@ Diagram illustrating the Clinica pipelines involved when performing a group comp ## Support - [Report an issue on GitHub](https://github.com/aramis-lab/clinica/issues) -- Use the [Clinica Google Group](https://groups.google.com/forum/#!forum/clinica-user) to ask for help! +- Use the [Clinica Google + Group](https://groups.google.com/forum/#!forum/clinica-user) to ask for help! @@ -108,7 +149,10 @@ Diagram illustrating the Clinica pipelines involved when performing a group comp @@ -116,7 +160,9 @@ We encourage you to contribute to Clinica! Please check out the [Contributing to ## License -This software is distributed under the MIT License. See [license file](https://github.com/aramis-lab/clinica/blob/dev/LICENSE.txt) for more information. +This software is distributed under the MIT License. See [license +file](https://github.com/aramis-lab/clinica/blob/dev/LICENSE.txt) for more +information. ## Related Repositories