def test_do_subject_files_exist_template_for_existing_files_exist(): subjects_dir = os.path.join(TEST_DATA_DIR, 'empty_subjects') subjects_file = os.path.join(subjects_dir, 'subjects_empty.txt') subjects_list = nit.read_subjects_file(subjects_file) assert len(subjects_list) == 3 missing = nit.do_subject_files_exist(subjects_list, subjects_dir, filename_template='${SUBJECT_ID}.txt') assert len(missing) == 0
def test_do_subject_files_exist_raises_on_too_much_fileinfo(): subjects_dir = TEST_DATA_DIR subjects_file = os.path.join(subjects_dir, 'subjects.txt') subjects_list = nit.read_subjects_file(subjects_file) assert len(subjects_list) == 5 with pytest.raises(ValueError) as exc_info: missing = nit.do_subject_files_exist(subjects_list, subjects_dir, filename='not_there', filename_template='not_there') assert 'Exactly one of' in str(exc_info.value)
def test_read_subjects_file_five_subjects(): subjects_file = os.path.join(TEST_DATA_DIR, 'subjects.txt') subject_ids = nit.read_subjects_file(subjects_file) assert len(subject_ids) == 5 assert 'subject1' in subject_ids assert 'subject2' in subject_ids assert 'subject3' in subject_ids assert 'subject4' in subject_ids assert 'subject5' in subject_ids
def test_read_subjects_file_csv_format_tab_separated_with_header(): subjects_file = os.path.join(TEST_DATA_DIR, 'subject_files_tab_separated', 'subjects_including_s6_tab_hdr.csv') subject_ids = nit.read_subjects_file(subjects_file, has_header_line=True, delimiter='\t') # the name arg 'delimiter' should be passed on to csv.reader by the function. This is tested here. assert len(subject_ids) == 6 assert 'subject1' in subject_ids assert 'subject2' in subject_ids assert 'subject3' in subject_ids assert 'subject4' in subject_ids assert 'subject5' in subject_ids assert 'subject6' in subject_ids
def test_read_subjects_file_csv_format_comma_separated_no_header(): subjects_file = os.path.join(TEST_DATA_DIR, 'subjects_including_s6.csv') subject_ids = nit.read_subjects_file(subjects_file) assert len(subject_ids) == 6 assert 'subject1' in subject_ids assert 'subject2' in subject_ids assert 'subject3' in subject_ids assert 'subject4' in subject_ids assert 'subject5' in subject_ids assert 'subject6' in subject_ids
def test_do_subject_files_exist_not_there(): subjects_dir = TEST_DATA_DIR subjects_file = os.path.join(subjects_dir, 'subjects.txt') subjects_list = nit.read_subjects_file(subjects_file) assert len(subjects_list) == 5 missing = nit.do_subject_files_exist(subjects_list, subjects_dir, filename='not_there') assert len(missing) == 5 assert 'subject1' in missing assert 'subject2' in missing assert 'subject3' in missing assert 'subject4' in missing assert 'subject5' in missing
def test_do_subject_files_exist_lh_area(): expected_subjects_dir = TEST_DATA_DIR expected_fsaverage_surf_dir = os.path.join(TEST_DATA_DIR, 'fsaverage', 'surf') if not os.path.isdir(expected_fsaverage_surf_dir): pytest.skip("Test data missing: e.g., directory '%s' does not exist. You can get all test data by running './develop/get_test_data_all.bash' in the repo root." % expected_fsaverage_surf_dir) subjects_dir = TEST_DATA_DIR subjects_file = os.path.join(subjects_dir, 'subjects.txt') subjects_list = nit.read_subjects_file(subjects_file) assert len(subjects_list) == 5 missing = nit.do_subject_files_exist(subjects_list, subjects_dir, filename='lh.area') assert len(missing) == 0
def test_do_subject_files_exist_template_for_existing_files(): subjects_dir = os.path.join(TEST_DATA_DIR, 'empty_subjects') subjects_file = os.path.join(subjects_dir, 'subjects_empty.txt') subjects_list = nit.read_subjects_file(subjects_file) assert len(subjects_list) == 3 expected_missing_file1 = os.path.join(subjects_dir, 'empty1', 'surf', 'empty1_not_there.txt') expected_missing_file2 = os.path.join(subjects_dir, 'empty2', 'surf', 'empty2_not_there.txt') expected_missing_file3 = os.path.join(subjects_dir, 'empty3', 'surf', 'empty3_not_there.txt') missing = nit.do_subject_files_exist(subjects_list, subjects_dir, filename_template='${SUBJECT_ID}_not_there.txt') assert len(missing) == 3 assert missing['empty1'] == expected_missing_file1 assert missing['empty2'] == expected_missing_file2 assert missing['empty3'] == expected_missing_file3
def brain_consistency(): """ Brain data consistency checks. Simple script to check brain data consistency. """ # Parse command line arguments parser = argparse.ArgumentParser( description="Check brain data consistency.") parser.add_argument( "subjects_dir", help= "The directory that contains your subjects. Note: in most cases you can pass the environment variable SUBJECTS_DIR." ) parser.add_argument( "subjects_file", help= "Text file containing all subjects that should be checked, one subject per line." ) parser.add_argument( "-m", "--measures-native", help= "Which vertex-wise native space measure data to check (e.g., 'area' to check files 'surf/lh.area' and similar). Colon-separated string or 'None'. Defaults to 'area:volume:thickness'.", default="area:volume:thickness") parser.add_argument( "-s", "--measures-standard", help= "Which vertex-wise standard space measure data to check (e.g., 'area' to check files 'surf/lh.area.fwhmX.fsaverage.mgh' and similar). Colon-separated string or 'None'. Defaults to 'area:volume:thickness'.", default="area:volume:thickness") parser.add_argument( "-a", "--average-subject", help= "Name of the average subject (template) for standard space data (see '-s'). Defaults to 'fsaverage'.", default="fsaverage") parser.add_argument( "-f", "--fwhm-list", help= "The list of fwhm files to check for standard space data (see '-s'). Defaults to '0:5:10:15:20:25'.", default="0:5:10:15:20:25") parser.add_argument( "-r", "--report", help= "File name for the report in HTML format. If not given, no HTML report is written.", default=None) verb_group = parser.add_mutually_exclusive_group(required=False) verb_group.add_argument("-v", "--verbose", help="Increase output verbosity to INFO.", action="store_true") verb_group.add_argument( "-w", "--verbosity", help= "Set verbosity level. One of 'WARN', 'INFO', or 'DEBUG'. Defaults to 'WARN'", default="WARN") args = parser.parse_args() log_level = logging.WARN # Default if args.verbose: log_level = logging.INFO elif args.verbosity: if args.verbosity == 'INFO': log_level = logging.INFO elif args.verbosity == 'DEBUG': log_level = logging.DEBUG logging.basicConfig(level=log_level) logger.info("---Brain Data Consistency Checks---") logger.info("Using subjects_dir '%s' and subjects file '%s'." % (args.subjects_dir, args.subjects_file)) native_measures = args.measures_native.split(":") if args.measures_native == "None": native_measures = [] standard_measures = args.measures_standard.split(":") if args.measures_standard == "None": standard_measures = [] standard_fwhm_list = args.fwhm_list.split(":") subjects_list = nit.read_subjects_file(args.subjects_file) logger.info("Handling %d subjects." % (len(subjects_list))) if len(native_measures): logger.info("Handling %d native space measures: %s" % (len(native_measures), ", ".join(native_measures))) else: logger.info("Not handling any native space measures.") if len(standard_measures): logger.info( "Handling %d standard space measures using template subject '%s': %s" % (len(standard_measures), args.average_subject, ", ".join(standard_measures))) logger.info( "Handling standard space measures at %d fwhm settings: %s" % (len(standard_fwhm_list), ", ".join(standard_fwhm_list))) else: logger.info("Not handling any standard space measures.") bdc = brainqa.BrainDataConsistency(args.subjects_dir, subjects_list, log_level=log_level) bdc.average_subject = args.average_subject bdc.fwhm_list = standard_fwhm_list bdc.check_custom(native_measures, standard_measures) if args.report: bdc.save_html_report(args.report) sys.exit(0)
def test_read_subjects_file_one_subject(): subjects_file = os.path.join(TEST_DATA_DIR, 'subjects_only1.txt') subject_ids = nit.read_subjects_file(subjects_file) assert len(subject_ids) == 1 assert 'subject1' in subject_ids