def test_age_on_date(): """Test whether the age is determined correctly.""" bday = datetime(1994, 1, 26) exp1 = datetime(2018, 1, 25) exp2 = datetime(2018, 1, 26) exp3 = datetime(2018, 1, 27) exp4 = datetime(1990, 1, 1) assert _age_on_date(bday, exp1) == 23 assert _age_on_date(bday, exp2) == 24 assert _age_on_date(bday, exp3) == 24 with pytest.raises(ValueError): _age_on_date(bday, exp4)
def _participants_tsv(raw, subject_id, fname, overwrite=False, verbose=True): """Create a participants.tsv file and save it. This will append any new participant data to the current list if it exists. Otherwise a new file will be created with the provided information. Parameters ---------- raw : instance of Raw The data as MNE-Python Raw object. subject_id : str The subject name in BIDS compatible format ('01', '02', etc.) fname : str Filename to save the participants.tsv to. overwrite : bool Whether to overwrite the existing file. Defaults to False. If there is already data for the given `subject_id` and overwrite is False, an error will be raised. verbose : bool Set verbose output to true or false. """ subject_id = 'sub-' + subject_id data = OrderedDict(participant_id=[subject_id]) subject_age = "n/a" sex = "n/a" subject_info = raw.info['subject_info'] if subject_info is not None: sexes = {0: 'n/a', 1: 'M', 2: 'F'} sex = sexes[subject_info.get('sex', 0)] # determine the age of the participant age = subject_info.get('birthday', None) meas_date = raw.info.get('meas_date', None) if isinstance(meas_date, (tuple, list, np.ndarray)): meas_date = meas_date[0] if meas_date is not None and age is not None: bday = datetime(age[0], age[1], age[2]) meas_datetime = datetime.fromtimestamp(meas_date) subject_age = _age_on_date(bday, meas_datetime) else: subject_age = "n/a" data.update({'age': [subject_age], 'sex': [sex]}) if os.path.exists(fname): orig_data = _from_tsv(fname) # whether the new data exists identically in the previous data exact_included = _contains_row(orig_data, {'participant_id': subject_id, 'age': subject_age, 'sex': sex}) # whether the subject id is in the previous data sid_included = subject_id in orig_data['participant_id'] # if the subject data provided is different to the currently existing # data and overwrite is not True raise an error if (sid_included and not exact_included) and not overwrite: raise FileExistsError('"%s" already exists in the participant ' # noqa: E501 F821 'list. Please set overwrite to ' 'True.' % subject_id) # otherwise add the new data data = _combine(orig_data, data, 'participant_id') # overwrite is forced to True as all issues with overwrite == False have # been handled by this point _write_tsv(fname, data, True, verbose) return fname