def _test_anonymize_info(base_info): """Test that sensitive information can be anonymized.""" pytest.raises(TypeError, anonymize_info, 'foo') default_anon_dos = datetime(2000, 1, 1, 0, 0, 0, tzinfo=timezone.utc) default_str = "mne_anonymize" default_subject_id = 0 default_desc = ("Anonymized using a time shift" + " to preserve age at acquisition") # Test no error for incomplete info info = base_info.copy() info.pop('file_id') anonymize_info(info) # Fake some subject data meas_date = datetime(2010, 1, 1, 0, 0, 0, tzinfo=timezone.utc) base_info['meas_date'] = meas_date base_info['subject_info'] = dict(id=1, his_id='foobar', last_name='bar', first_name='bar', birthday=(1987, 4, 8), sex=0, hand=1) # generate expected info... # first expected result with no options. # will move DOS from 2010/1/1 to 2000/1/1 which is 3653 days. exp_info = base_info.copy() exp_info['description'] = default_desc exp_info['experimenter'] = default_str exp_info['proj_name'] = default_str exp_info['proj_id'] = np.array([0]) exp_info['subject_info']['first_name'] = default_str exp_info['subject_info']['last_name'] = default_str exp_info['subject_info']['id'] = default_subject_id exp_info['subject_info']['his_id'] = str(default_subject_id) # this bday is 3653 days different. the change in day is due to a # different number of leap days between 1987 and 1977 than between # 2010 and 2000. exp_info['subject_info']['birthday'] = (1977, 4, 7) exp_info['meas_date'] = default_anon_dos # make copies exp_info_3 = exp_info.copy() # adjust each expected outcome delta_t = timedelta(days=3653) for key in ('file_id', 'meas_id'): value = exp_info.get(key) if value is not None: assert 'msecs' not in value tmp = _add_timedelta_to_stamp((value['secs'], value['usecs']), -delta_t) value['secs'] = tmp[0] value['usecs'] = tmp[1] value['machid'][:] = 0 # exp 2 tests the keep_his option exp_info_2 = exp_info.copy() exp_info_2['subject_info']['his_id'] = 'foobar' # exp 3 tests is a supplied daysback delta_t_2 = timedelta(days=43) exp_info_3['subject_info']['birthday'] = (1987, 2, 24) exp_info_3['meas_date'] = meas_date - delta_t_2 for key in ('file_id', 'meas_id'): value = exp_info_3.get(key) if value is not None: assert 'msecs' not in value tmp = _add_timedelta_to_stamp((value['secs'], value['usecs']), -delta_t_2) value['secs'] = tmp[0] value['usecs'] = tmp[1] value['machid'][:] = 0 # exp 4 tests is a supplied daysback delta_t_3 = timedelta(days=223 + 364 * 500) new_info = anonymize_info(base_info.copy()) assert_object_equal(new_info, exp_info) new_info = anonymize_info(base_info.copy(), keep_his=True) assert_object_equal(new_info, exp_info_2) new_info = anonymize_info(base_info.copy(), daysback=delta_t_2.days) assert_object_equal(new_info, exp_info_3) with pytest.raises(RuntimeError, match='anonymize_info generated'): anonymize_info(base_info.copy(), daysback=delta_t_3.days) # assert_object_equal(new_info, exp_info_4) # test with meas_date = None base_info['meas_date'] = None exp_info_3['meas_date'] = None exp_info_3['file_id']['secs'] = DATE_NONE[0] exp_info_3['file_id']['usecs'] = DATE_NONE[1] exp_info_3['meas_id']['secs'] = DATE_NONE[0] exp_info_3['meas_id']['usecs'] = DATE_NONE[1] exp_info_3['subject_info'].pop('birthday', None) if base_info['meas_date'] is None: with pytest.warns(RuntimeWarning, match='all information'): new_info = anonymize_info(base_info.copy(), daysback=delta_t_2.days) else: new_info = anonymize_info(base_info.copy(), daysback=delta_t_2.days) assert_object_equal(new_info, exp_info_3) with pytest.warns(None): # meas_date is None new_info = anonymize_info(base_info.copy()) assert_object_equal(new_info, exp_info_3)
def _test_anonymize_info(base_info): """Test that sensitive information can be anonymized.""" pytest.raises(TypeError, anonymize_info, 'foo') default_anon_dos = datetime(2000, 1, 1, 0, 0, 0, tzinfo=timezone.utc) default_str = "mne_anonymize" default_subject_id = 0 default_desc = ("Anonymized using a time shift" + " to preserve age at acquisition") # Test no error for incomplete info info = base_info.copy() info.pop('file_id') anonymize_info(info) # Fake some subject data meas_date = datetime(2010, 1, 1, 0, 0, 0, tzinfo=timezone.utc) base_info['meas_date'] = _dt_to_stamp(meas_date) base_info['subject_info'] = dict(id=1, his_id='foobar', last_name='bar', first_name='bar', birthday=(1987, 4, 8), sex=0, hand=1) # generate expected info... # first expected result with no options. # will move DOS from 2010/1/1 to 2000/1/1 which is 3653 days. exp_info = base_info.copy() exp_info['description'] = default_desc exp_info['experimenter'] = default_str exp_info['proj_name'] = default_str exp_info['proj_id'][:] = 0 exp_info['subject_info']['first_name'] = default_str exp_info['subject_info']['last_name'] = default_str exp_info['subject_info']['id'] = default_subject_id exp_info['subject_info']['his_id'] = str(default_subject_id) # this bday is 3653 days different. the change in day is due to a # different number of leap days between 1987 and 1977 than between # 2010 and 2000. exp_info['subject_info']['birthday'] = (1977, 4, 7) exp_info['meas_date'] = _dt_to_stamp(default_anon_dos) for key in ('file_id', 'meas_id'): value = exp_info.get(key) if value is not None: assert 'msecs' not in value value['secs'] = exp_info['meas_date'][0] value['usecs'] = exp_info['meas_date'][1] value['machid'][:] = 0 # exp 2 tests the keep_his option exp_info_2 = exp_info.copy() exp_info_2['subject_info']['his_id'] = 'foobar' # exp 3 tests is a supplied daysback dt = timedelta(days=43) exp_info_3 = exp_info.copy() exp_info_3['subject_info']['birthday'] = (1987, 2, 24) exp_info_3['meas_date'] = _dt_to_stamp(meas_date - dt) for key in ('file_id', 'meas_id'): value = exp_info_3.get(key) if value is not None: assert 'msecs' not in value value['secs'] = exp_info_3['meas_date'][0] value['usecs'] = exp_info_3['meas_date'][1] value['machid'][:] = 0 new_info = anonymize_info(base_info.copy()) assert_object_equal(new_info, exp_info) new_info = anonymize_info(base_info.copy(), keep_his=True) assert_object_equal(new_info, exp_info_2) new_info = anonymize_info(base_info.copy(), daysback=dt.days) assert_object_equal(new_info, exp_info_3)
def test_read_write_info(tmpdir): """Test IO of info.""" info = read_info(raw_fname) temp_file = str(tmpdir.join('info.fif')) # check for bug `#1198` info['dev_head_t']['trans'] = np.eye(4) t1 = info['dev_head_t']['trans'] write_info(temp_file, info) info2 = read_info(temp_file) t2 = info2['dev_head_t']['trans'] assert (len(info['chs']) == len(info2['chs'])) assert_array_equal(t1, t2) # proc_history (e.g., GH#1875) creator = u'é' info = read_info(chpi_fname) info['proc_history'][0]['creator'] = creator info['hpi_meas'][0]['creator'] = creator info['subject_info']['his_id'] = creator info['subject_info']['weight'] = 11.1 info['subject_info']['height'] = 2.3 if info['gantry_angle'] is None: # future testing data may include it info['gantry_angle'] = 0. # Elekta supine position gantry_angle = info['gantry_angle'] meas_id = info['meas_id'] write_info(temp_file, info) info = read_info(temp_file) assert info['proc_history'][0]['creator'] == creator assert info['hpi_meas'][0]['creator'] == creator assert info['subject_info']['his_id'] == creator assert info['gantry_angle'] == gantry_angle assert info['subject_info']['height'] == 2.3 assert info['subject_info']['weight'] == 11.1 for key in ['secs', 'usecs', 'version']: assert info['meas_id'][key] == meas_id[key] assert_array_equal(info['meas_id']['machid'], meas_id['machid']) # Test that writing twice produces the same file m1 = hashlib.md5() with open(temp_file, 'rb') as fid: m1.update(fid.read()) m1 = m1.hexdigest() temp_file_2 = tmpdir.join('info2.fif') assert temp_file_2 != temp_file write_info(temp_file_2, info) m2 = hashlib.md5() with open(str(temp_file_2), 'rb') as fid: m2.update(fid.read()) m2 = m2.hexdigest() assert m1 == m2 info = read_info(raw_fname) info['meas_date'] = None anonymize_info(info, verbose='error') assert info['meas_date'] is None tmp_fname_3 = tmpdir.join('info3.fif') write_info(tmp_fname_3, info) assert info['meas_date'] is None info2 = read_info(tmp_fname_3) assert info2['meas_date'] is None # Check that having a very old date in fine until you try to save it to fif info['meas_date'] = datetime(1800, 1, 1, 0, 0, 0, tzinfo=timezone.utc) info._check_consistency() fname = tmpdir.join('test.fif') with pytest.raises(RuntimeError, match='must be between '): write_info(fname, info)
def test_read_write_info(tmpdir): """Test IO of info.""" info = read_info(raw_fname) temp_file = str(tmpdir.join('info.fif')) # check for bug `#1198` info['dev_head_t']['trans'] = np.eye(4) t1 = info['dev_head_t']['trans'] write_info(temp_file, info) info2 = read_info(temp_file) t2 = info2['dev_head_t']['trans'] assert (len(info['chs']) == len(info2['chs'])) assert_array_equal(t1, t2) # proc_history (e.g., GH#1875) creator = u'é' info = read_info(chpi_fname) info['proc_history'][0]['creator'] = creator info['hpi_meas'][0]['creator'] = creator info['subject_info']['his_id'] = creator info['subject_info']['weight'] = 11.1 info['subject_info']['height'] = 2.3 if info['gantry_angle'] is None: # future testing data may include it info['gantry_angle'] = 0. # Elekta supine position gantry_angle = info['gantry_angle'] meas_id = info['meas_id'] write_info(temp_file, info) info = read_info(temp_file) assert info['proc_history'][0]['creator'] == creator assert info['hpi_meas'][0]['creator'] == creator assert info['subject_info']['his_id'] == creator assert info['gantry_angle'] == gantry_angle assert info['subject_info']['height'] == 2.3 assert info['subject_info']['weight'] == 11.1 for key in ['secs', 'usecs', 'version']: assert info['meas_id'][key] == meas_id[key] assert_array_equal(info['meas_id']['machid'], meas_id['machid']) # Test that writing twice produces the same file m1 = hashlib.md5() with open(temp_file, 'rb') as fid: m1.update(fid.read()) m1 = m1.hexdigest() temp_file_2 = tmpdir.join('info2.fif') assert temp_file_2 != temp_file write_info(temp_file_2, info) m2 = hashlib.md5() with open(str(temp_file_2), 'rb') as fid: m2.update(fid.read()) m2 = m2.hexdigest() assert m1 == m2 info = read_info(raw_fname) info['meas_date'] = None anonymize_info(info) assert info['meas_date'] is None tmp_fname_3 = tmpdir.join('info3.fif') write_info(tmp_fname_3, info) assert info['meas_date'] is None info2 = read_info(tmp_fname_3) assert info2['meas_date'] is None