Initial commit

This commit is contained in:
2021-03-27 14:58:49 +01:00
commit fc4eec6ac7
20 changed files with 1613 additions and 0 deletions

86
test/test.py Normal file
View File

@@ -0,0 +1,86 @@
import unittest
import mne
import pandas as pd
from decoding_tf_analysis import events_to_labels, permutation_test
from erp_analysis import create_peak_difference_feature
from utils.file_utils import get_keys_for_events, get_epochs
from pandas.testing import assert_frame_equal
class TestFileUtils(unittest.TestCase):
def setUp(self):
# Load true values for keys
with open('test_files/face.txt') as f:
face = f.readlines()
self.face = [x.strip() for x in face]
with open('test_files/face_intact.txt') as f:
face_intact = f.readlines()
self.face_intact = [x.strip() for x in face_intact]
with open('test_files/face_scrambled.txt') as f:
face_scrambled = f.readlines()
self.face_scrambled = [x.strip() for x in face_scrambled]
# Load true epochs
self.raw = mne.io.read_raw_fif("..\\Dataset\\n170\\sub-001\\ses-n170\\eeg\\sub-001_task-n170_cleaned.fif")
wanted_keys = get_keys_for_events("face", "intact")
events, events_dict = mne.events_from_annotations(self.raw)
events_dict_key = dict((k, events_dict[k]) for k in wanted_keys if k in events_dict)
self.given = mne.Epochs(self.raw, events, events_dict_key, tmin=-0.2, tmax=0.5, reject_by_annotation=False,
picks='P7')
self.given.drop_bad()
self.given.load_data()
def test_keys_for_events(self):
# Test only for face key generation, as the rest is generated analogously
self.assertEqual("stimulus", get_keys_for_events(stimulus=None, condition=None))
self.assertEqual(self.face, get_keys_for_events(stimulus='face', condition=None))
self.assertEqual(self.face_intact, get_keys_for_events(stimulus='face', condition='intact'))
self.assertEqual(self.face_scrambled, get_keys_for_events(stimulus='face', condition='scrambled'))
def test_get_epochs(self):
# Get a epoch to compare against
epochs, key = get_epochs(self.raw, [("face", "intact")], picks='P7', tmin=-0.2, tmax=0.5)
epochs.load_data()
self.assertEqual(self.given, epochs)
class TestERPAnalysis(unittest.TestCase):
def test_difference_features(self):
# Check if the correct features are created
subject_ids = [1, 1, 1, 1]
stimuli = ['face', 'face', 'car', 'car']
conditions = ['intact', 'scrambled', 'intact', 'scrambled']
peaks = [1, 2, 3, 4]
df = pd.DataFrame(data={'subject_id': subject_ids, 'stimulus': stimuli, 'condition': conditions,
'peak': peaks})
diff_df_true = pd.DataFrame(
data={'subject_id': ['001'], 'mean_face': [1.5], 'mean_car': [3.5], 'peak_diff_overall': [-2.0],
'diff_intact': [2.0], 'diff_scrambled': [2.0], 'diff_face': [1.0], 'diff_fc_ci': [-1.0],
'diff_fi_rest': [-2.0]})
diff_df = create_peak_difference_feature(df, 1)
assert_frame_equal(diff_df_true, diff_df)
class TestDecodingTFAnalysis(unittest.TestCase):
def test_events_to_labels(self):
# Only check for stimuli 1-40, 41-80, 101-140, 141-180 as no other stimuli are possible
events_dict = {'stimulus:1': 1, 'stimulus:40': 2, 'stimulus:41': 3, 'stimulus:80': 4, 'stimulus:101': 5,
'stimulus:140': 6, 'stimulus:141': 7, 'stimulus:180': 8}
labels = events_to_labels([1, 2, 3, 4, 5, 6, 7, 8], events_dict, [0, 1, 2, 3])
self.assertCountEqual([0, 0, 1, 1, 2, 2, 3, 3], labels)
def test_permutation_test(self):
# Check permutation test
p = permutation_test([0, 0, 0, 0], [0, 0, 0, 0], 100)
self.assertEqual(1, p)
p = permutation_test([0, 0, 0, 0, 0], [5, 10, 15, 10, 5], 100)
self.assertGreater(0.05, p)
if __name__ == '__main__':
mne.set_log_level(verbose='WARNING') # Avoid full console
unittest.main()

160
test/test_files/face.csv Normal file
View File

@@ -0,0 +1,160 @@
stimulus:1
stimulus:2
stimulus:3
stimulus:4
stimulus:5
stimulus:6
stimulus:7
stimulus:8
stimulus:9
stimulus:10
stimulus:11
stimulus:12
stimulus:13
stimulus:14
stimulus:15
stimulus:16
stimulus:17
stimulus:18
stimulus:19
stimulus:20
stimulus:21
stimulus:22
stimulus:23
stimulus:24
stimulus:25
stimulus:26
stimulus:27
stimulus:28
stimulus:29
stimulus:30
stimulus:31
stimulus:32
stimulus:33
stimulus:34
stimulus:35
stimulus:36
stimulus:37
stimulus:38
stimulus:39
stimulus:40
stimulus:41
stimulus:42
stimulus:43
stimulus:44
stimulus:45
stimulus:46
stimulus:47
stimulus:48
stimulus:49
stimulus:50
stimulus:51
stimulus:52
stimulus:53
stimulus:54
stimulus:55
stimulus:56
stimulus:57
stimulus:58
stimulus:59
stimulus:60
stimulus:61
stimulus:62
stimulus:63
stimulus:64
stimulus:65
stimulus:66
stimulus:67
stimulus:68
stimulus:69
stimulus:70
stimulus:71
stimulus:72
stimulus:73
stimulus:74
stimulus:75
stimulus:76
stimulus:77
stimulus:78
stimulus:79
stimulus:80
stimulus:101
stimulus:102
stimulus:103
stimulus:104
stimulus:105
stimulus:106
stimulus:107
stimulus:108
stimulus:109
stimulus:110
stimulus:111
stimulus:112
stimulus:113
stimulus:114
stimulus:115
stimulus:116
stimulus:117
stimulus:118
stimulus:119
stimulus:120
stimulus:121
stimulus:122
stimulus:123
stimulus:124
stimulus:125
stimulus:126
stimulus:127
stimulus:128
stimulus:129
stimulus:130
stimulus:131
stimulus:132
stimulus:133
stimulus:134
stimulus:135
stimulus:136
stimulus:137
stimulus:138
stimulus:139
stimulus:140
stimulus:141
stimulus:142
stimulus:143
stimulus:144
stimulus:145
stimulus:146
stimulus:147
stimulus:148
stimulus:149
stimulus:150
stimulus:151
stimulus:152
stimulus:153
stimulus:154
stimulus:155
stimulus:156
stimulus:157
stimulus:158
stimulus:159
stimulus:160
stimulus:161
stimulus:162
stimulus:163
stimulus:164
stimulus:165
stimulus:166
stimulus:167
stimulus:168
stimulus:169
stimulus:170
stimulus:171
stimulus:172
stimulus:173
stimulus:174
stimulus:175
stimulus:176
stimulus:177
stimulus:178
stimulus:179
stimulus:180
1 stimulus:1
2 stimulus:2
3 stimulus:3
4 stimulus:4
5 stimulus:5
6 stimulus:6
7 stimulus:7
8 stimulus:8
9 stimulus:9
10 stimulus:10
11 stimulus:11
12 stimulus:12
13 stimulus:13
14 stimulus:14
15 stimulus:15
16 stimulus:16
17 stimulus:17
18 stimulus:18
19 stimulus:19
20 stimulus:20
21 stimulus:21
22 stimulus:22
23 stimulus:23
24 stimulus:24
25 stimulus:25
26 stimulus:26
27 stimulus:27
28 stimulus:28
29 stimulus:29
30 stimulus:30
31 stimulus:31
32 stimulus:32
33 stimulus:33
34 stimulus:34
35 stimulus:35
36 stimulus:36
37 stimulus:37
38 stimulus:38
39 stimulus:39
40 stimulus:40
41 stimulus:41
42 stimulus:42
43 stimulus:43
44 stimulus:44
45 stimulus:45
46 stimulus:46
47 stimulus:47
48 stimulus:48
49 stimulus:49
50 stimulus:50
51 stimulus:51
52 stimulus:52
53 stimulus:53
54 stimulus:54
55 stimulus:55
56 stimulus:56
57 stimulus:57
58 stimulus:58
59 stimulus:59
60 stimulus:60
61 stimulus:61
62 stimulus:62
63 stimulus:63
64 stimulus:64
65 stimulus:65
66 stimulus:66
67 stimulus:67
68 stimulus:68
69 stimulus:69
70 stimulus:70
71 stimulus:71
72 stimulus:72
73 stimulus:73
74 stimulus:74
75 stimulus:75
76 stimulus:76
77 stimulus:77
78 stimulus:78
79 stimulus:79
80 stimulus:80
81 stimulus:101
82 stimulus:102
83 stimulus:103
84 stimulus:104
85 stimulus:105
86 stimulus:106
87 stimulus:107
88 stimulus:108
89 stimulus:109
90 stimulus:110
91 stimulus:111
92 stimulus:112
93 stimulus:113
94 stimulus:114
95 stimulus:115
96 stimulus:116
97 stimulus:117
98 stimulus:118
99 stimulus:119
100 stimulus:120
101 stimulus:121
102 stimulus:122
103 stimulus:123
104 stimulus:124
105 stimulus:125
106 stimulus:126
107 stimulus:127
108 stimulus:128
109 stimulus:129
110 stimulus:130
111 stimulus:131
112 stimulus:132
113 stimulus:133
114 stimulus:134
115 stimulus:135
116 stimulus:136
117 stimulus:137
118 stimulus:138
119 stimulus:139
120 stimulus:140
121 stimulus:141
122 stimulus:142
123 stimulus:143
124 stimulus:144
125 stimulus:145
126 stimulus:146
127 stimulus:147
128 stimulus:148
129 stimulus:149
130 stimulus:150
131 stimulus:151
132 stimulus:152
133 stimulus:153
134 stimulus:154
135 stimulus:155
136 stimulus:156
137 stimulus:157
138 stimulus:158
139 stimulus:159
140 stimulus:160
141 stimulus:161
142 stimulus:162
143 stimulus:163
144 stimulus:164
145 stimulus:165
146 stimulus:166
147 stimulus:167
148 stimulus:168
149 stimulus:169
150 stimulus:170
151 stimulus:171
152 stimulus:172
153 stimulus:173
154 stimulus:174
155 stimulus:175
156 stimulus:176
157 stimulus:177
158 stimulus:178
159 stimulus:179
160 stimulus:180

80
test/test_files/face.txt Normal file
View File

@@ -0,0 +1,80 @@
stimulus:1
stimulus:2
stimulus:3
stimulus:4
stimulus:5
stimulus:6
stimulus:7
stimulus:8
stimulus:9
stimulus:10
stimulus:11
stimulus:12
stimulus:13
stimulus:14
stimulus:15
stimulus:16
stimulus:17
stimulus:18
stimulus:19
stimulus:20
stimulus:21
stimulus:22
stimulus:23
stimulus:24
stimulus:25
stimulus:26
stimulus:27
stimulus:28
stimulus:29
stimulus:30
stimulus:31
stimulus:32
stimulus:33
stimulus:34
stimulus:35
stimulus:36
stimulus:37
stimulus:38
stimulus:39
stimulus:40
stimulus:101
stimulus:102
stimulus:103
stimulus:104
stimulus:105
stimulus:106
stimulus:107
stimulus:108
stimulus:109
stimulus:110
stimulus:111
stimulus:112
stimulus:113
stimulus:114
stimulus:115
stimulus:116
stimulus:117
stimulus:118
stimulus:119
stimulus:120
stimulus:121
stimulus:122
stimulus:123
stimulus:124
stimulus:125
stimulus:126
stimulus:127
stimulus:128
stimulus:129
stimulus:130
stimulus:131
stimulus:132
stimulus:133
stimulus:134
stimulus:135
stimulus:136
stimulus:137
stimulus:138
stimulus:139
stimulus:140

View File

@@ -0,0 +1,40 @@
stimulus:1
stimulus:2
stimulus:3
stimulus:4
stimulus:5
stimulus:6
stimulus:7
stimulus:8
stimulus:9
stimulus:10
stimulus:11
stimulus:12
stimulus:13
stimulus:14
stimulus:15
stimulus:16
stimulus:17
stimulus:18
stimulus:19
stimulus:20
stimulus:21
stimulus:22
stimulus:23
stimulus:24
stimulus:25
stimulus:26
stimulus:27
stimulus:28
stimulus:29
stimulus:30
stimulus:31
stimulus:32
stimulus:33
stimulus:34
stimulus:35
stimulus:36
stimulus:37
stimulus:38
stimulus:39
stimulus:40

View File

@@ -0,0 +1,40 @@
stimulus:101
stimulus:102
stimulus:103
stimulus:104
stimulus:105
stimulus:106
stimulus:107
stimulus:108
stimulus:109
stimulus:110
stimulus:111
stimulus:112
stimulus:113
stimulus:114
stimulus:115
stimulus:116
stimulus:117
stimulus:118
stimulus:119
stimulus:120
stimulus:121
stimulus:122
stimulus:123
stimulus:124
stimulus:125
stimulus:126
stimulus:127
stimulus:128
stimulus:129
stimulus:130
stimulus:131
stimulus:132
stimulus:133
stimulus:134
stimulus:135
stimulus:136
stimulus:137
stimulus:138
stimulus:139
stimulus:140

View File

@@ -0,0 +1,19 @@
from utils.file_utils import load_preprocessed_data, get_epochs
def check_peaks():
"""
Sanity check for the "get_peaks" method
"""
import matplotlib.pyplot as plt
raw = load_preprocessed_data('002', 'N170')
epochs, _ = get_epochs(raw, [('face', 'intact')], picks='P7')
ch, latency, peak = epochs.average().get_peak(tmin=0.13, tmax=0.2, mode='neg', return_amplitude=True)
import numpy as np
plt.plot(epochs.times, np.squeeze(epochs.average().data.T))
plt.vlines([0.13, 0.2], -0.00001, 0.00001, colors='r', linestyles='dotted')
plt.vlines(latency, -0.00001, 0.00001, colors='gray', linestyles='dotted')
plt.show()
check_peaks()