Skip to content

Commit 7f499e8

Browse files
committed
add user evaluation tests
1 parent 61572c0 commit 7f499e8

File tree

3 files changed

+67
-17
lines changed

3 files changed

+67
-17
lines changed

atlaselectrophysiology/load_data.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import glob
1111
from atlaselectrophysiology.load_histology import download_histology_data, tif2nrrd
1212

13-
ONE_BASE_URL = "https://alyx.internationalbrainlab.org"
13+
ONE_BASE_URL = "https://dev.alyx.internationalbrainlab.org"
1414

1515

1616
class LoadData:
@@ -127,8 +127,6 @@ def get_previous_alignments(self):
127127
self.alignments = {}
128128
self.prev_align = ['original']
129129

130-
print(self.alignments)
131-
132130
return self.prev_align
133131

134132
def get_starting_alignment(self, idx):
@@ -372,14 +370,17 @@ def upload_data(self, xyz_channels, channels=True):
372370

373371
return channel_upload
374372

375-
def update_alignments(self, feature, track, key_info=None):
373+
def update_alignments(self, feature, track, key_info=None, user_eval=None):
376374
if not key_info:
377375
user = self.one._par.ALYX_LOGIN
378376
date = datetime.now().replace(microsecond=0).isoformat()
379377
data = {date + '_' + user: [feature.tolist(), track.tolist(), self.alyx_str]}
380378
else:
381379
user = key_info[20:]
382-
data = {key_info: [feature.tolist(), track.tolist()]}
380+
if user_eval:
381+
data = {key_info: [feature.tolist(), track.tolist(), user_eval]}
382+
else:
383+
data = {key_info: [feature.tolist(), track.tolist()]}
383384

384385
old_user = [key for key in self.alignments.keys() if user in key]
385386
# Only delete duplicated if trajectory is not resolved

atlaselectrophysiology/plot_data.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,10 +508,11 @@ def get_passive_events(self):
508508
stims = self.vis_stim
509509
elif self.passive_data_status and not self.gabor_data_status:
510510
stim_types = ['valveOn', 'toneOn', 'noiseOn']
511-
stims = self.aud_stim
511+
stims = {stim_type: self.aud_stim[stim_type] for stim_type in stim_types}
512512
else:
513513
stim_types = stim_keys
514-
stims = {**self.vis_stim, **self.aud_stim}
514+
stims = {stim_type: self.aud_stim[stim_type] for stim_type in stim_types[0:3]}
515+
stims.update(self.vis_stim)
515516

516517
base_stim = 1
517518
pre_stim = 0.4

tests/test_alignment_qc_gui.py

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@
1818
class TestsAlignmentQcGUI(unittest.TestCase):
1919
@classmethod
2020
def setUpClass(cls) -> None:
21-
probe = ['probe00']
21+
probe = ['probe00', 'probe01']
2222
create_alyx_probe_insertions(session_path=EPHYS_SESSION, model='3B2', labels=probe,
2323
one=one, force=True)
2424
cls.probe_id = one.alyx.rest('insertions', 'list', session=EPHYS_SESSION,
2525
name='probe00')[0]['id']
26+
cls.probe_id2 = one.alyx.rest('insertions', 'list', session=EPHYS_SESSION,
27+
name='probe01')[0]['id']
2628
data = np.load(Path(Path(__file__).parent.
2729
joinpath('fixtures', 'data_alignmentqc_gui.npz')), allow_pickle=True)
2830
cls.xyz_picks = data['xyz_picks']
2931
cls.alignments = data['alignments'].tolist()
3032
cls.cluster_chns = data['cluster_chns']
3133
register_track(cls.probe_id, picks=cls.xyz_picks, one=one, overwrite=True,
3234
channels=False)
35+
register_track(cls.probe_id2, picks=cls.xyz_picks, one=one, overwrite=True,
36+
channels=False)
3337

3438
def setUp(self) -> None:
3539
self.resolved_key = '2020-09-14T15:44:56_nate'
@@ -71,21 +75,26 @@ def test_02_one_alignment(self):
7175
provenance='Ephys aligned histology track')
7276
assert (sorted(list(traj[0]['json'].keys()), reverse=True)[0] == key)
7377
assert (len(traj[0]['json']) == 1)
78+
# Not added user evaluation so should just contain feature and track lists
79+
assert(len(traj[0]['json'][key]) == 2)
7480

7581
self.ld.update_qc(upload_flatiron=False)
7682
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
7783
assert (insertion['json']['extended_qc']['alignment_count'] == 1)
7884
assert (insertion['json']['extended_qc']['alignment_stored'] == key)
85+
assert (not insertion['json']['extended_qc'].get('experimenter', None))
7986
assert (insertion['json']['qc'] == 'NOT_SET')
8087
assert (self.ld.resolved == 0)
8188

8289
def test_03_same_user(self):
8390
key = '2020-08-26T17:06:58_alejandro'
91+
eval_str = 'PASS: Noise and artifact'
8492
feature = self.alignments[key][0]
8593
track = self.alignments[key][1]
8694
xyz_channels = self.ephysalign.get_channel_locations(feature, track)
8795
self.ld.upload_data(xyz_channels, channels=False)
88-
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key)
96+
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key,
97+
user_eval=eval_str)
8998
_ = self.ld.get_previous_alignments()
9099
_ = self.ld.get_starting_alignment(0)
91100
assert (self.ld.current_align == key)
@@ -95,14 +104,16 @@ def test_03_same_user(self):
95104
traj_id = traj[0]['id']
96105
assert (sorted(list(traj[0]['json'].keys()), reverse=True)[0] == key)
97106
assert (len(traj[0]['json']) == 1)
107+
assert(len(traj[0]['json'][key]) == 3)
98108
assert (traj_id != self.prev_traj_id)
99109

100110
self.ld.update_qc(upload_flatiron=False)
101111
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
102112
assert (insertion['json']['extended_qc']['alignment_count'] == 1)
103113
assert (insertion['json']['extended_qc']['alignment_stored'] == key)
104114
assert (insertion['json']['extended_qc']['alignment_resolved'] == 0)
105-
assert (insertion['json']['qc'] == 'NOT_SET')
115+
assert(insertion['json']['extended_qc']['experimenter'] == 'PASS')
116+
assert (insertion['json']['qc'] == 'PASS')
106117
assert (self.ld.resolved == 0)
107118

108119
def test_04_two_alignments(self):
@@ -122,12 +133,14 @@ def test_04_two_alignments(self):
122133
traj_id = traj[0]['id']
123134
assert (sorted(list(traj[0]['json'].keys()), reverse=True)[0] == key)
124135
assert (len(traj[0]['json']) == 2)
136+
assert(len(traj[0]['json'][key]) == 2)
125137
assert (traj_id != self.prev_traj_id)
126138
# Also assert all the keys match
127139

128140
self.ld.update_qc(upload_flatiron=False)
129141
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
130-
assert (insertion['json']['qc'] == 'NOT_SET')
142+
assert (insertion['json']['qc'] == 'PASS')
143+
assert (insertion['json']['extended_qc']['experimenter'] == 'PASS')
131144
assert (insertion['json']['extended_qc']['alignment_count'] == 2)
132145
assert (insertion['json']['extended_qc']['alignment_stored'] == key)
133146
assert (insertion['json']['extended_qc']['alignment_resolved'] == 0)
@@ -137,11 +150,13 @@ def test_04_two_alignments(self):
137150
def test_05_three_alignments(self):
138151

139152
key = '2020-09-14T15:44:56_nate'
153+
eval_str = 'WARNING: Drift'
140154
feature = self.alignments[key][0]
141155
track = self.alignments[key][1]
142156
xyz_channels = self.ephysalign.get_channel_locations(feature, track)
143157
self.ld.upload_data(xyz_channels, channels=False)
144-
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key)
158+
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key,
159+
user_eval=eval_str)
145160
_ = self.ld.get_previous_alignments()
146161
_ = self.ld.get_starting_alignment(0)
147162

@@ -152,11 +167,13 @@ def test_05_three_alignments(self):
152167
traj_id = traj[0]['id']
153168
assert (len(traj[0]['json']) == 3)
154169
assert (sorted(list(traj[0]['json'].keys()), reverse=True)[0] == key)
170+
assert(len(traj[0]['json'][key]) == 3)
155171
assert (traj_id != self.prev_traj_id)
156172

157173
self.ld.update_qc(upload_flatiron=False)
158174
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
159-
assert (insertion['json']['qc'] == 'NOT_SET')
175+
assert (insertion['json']['qc'] == 'WARNING')
176+
assert (insertion['json']['extended_qc']['experimenter'] == 'WARNING')
160177
assert (insertion['json']['extended_qc']['alignment_count'] == 3)
161178
assert (insertion['json']['extended_qc']['alignment_stored'] == key)
162179
assert (insertion['json']['extended_qc']['alignment_resolved'] == 1)
@@ -166,11 +183,13 @@ def test_05_three_alignments(self):
166183

167184
def test_06_new_user_after_resolved(self):
168185
key = '2020-09-16T15:44:56_mayo'
186+
eval_str = 'PASS: Drift'
169187
feature = self.alignments[key][0]
170188
track = self.alignments[key][1]
171189
xyz_channels = self.ephysalign.get_channel_locations(feature, track)
172190
self.ld.upload_data(xyz_channels, channels=False)
173-
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key)
191+
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key,
192+
user_eval=eval_str)
174193
_ = self.ld.get_previous_alignments()
175194
_ = self.ld.get_starting_alignment(0)
176195

@@ -185,7 +204,8 @@ def test_06_new_user_after_resolved(self):
185204

186205
self.ld.update_qc(upload_flatiron=False)
187206
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
188-
assert (insertion['json']['qc'] == 'NOT_SET')
207+
assert (insertion['json']['qc'] == 'WARNING')
208+
assert (insertion['json']['extended_qc']['experimenter'] == 'WARNING')
189209
assert (insertion['json']['extended_qc']['alignment_count'] == 4)
190210
assert (insertion['json']['extended_qc']['alignment_stored'] == self.resolved_key)
191211
assert (insertion['json']['extended_qc']['alignment_resolved'] == 1)
@@ -195,11 +215,13 @@ def test_06_new_user_after_resolved(self):
195215

196216
def test_07_same_user_after_resolved(self):
197217
key = '2020-10-14T15:44:56_nate'
218+
eval_str = 'CRITICAL: Brain Damage'
198219
feature = self.alignments[key][0]
199220
track = self.alignments[key][1]
200221
xyz_channels = self.ephysalign.get_channel_locations(feature, track)
201222
self.ld.upload_data(xyz_channels, channels=False)
202-
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key)
223+
self.ld.update_alignments(np.array(feature), np.array(track), key_info=key,
224+
user_eval=eval_str)
203225
_ = self.ld.get_previous_alignments()
204226
_ = self.ld.get_starting_alignment(0)
205227

@@ -214,17 +236,43 @@ def test_07_same_user_after_resolved(self):
214236

215237
self.ld.update_qc(upload_flatiron=False)
216238
insertion = one.alyx.rest('insertions', 'read', id=self.probe_id)
217-
assert (insertion['json']['qc'] == 'NOT_SET')
239+
assert (insertion['json']['qc'] == 'CRITICAL')
240+
assert (insertion['json']['extended_qc']['experimenter'] == 'CRITICAL')
218241
assert (insertion['json']['extended_qc']['alignment_count'] == 5)
219242
assert (insertion['json']['extended_qc']['alignment_stored'] == self.resolved_key)
220243
assert (insertion['json']['extended_qc']['alignment_resolved'] == 1)
221244
assert (insertion['json']['extended_qc']['alignment_resolved_by'] == 'qc')
222245
assert (insertion['json']['extended_qc']['alignment_qc'] > 0.8)
223246
assert (self.ld.resolved == 1)
224247

248+
def test_08_starting_alignments(self):
249+
key = '2020-10-14T15:44:56_nate'
250+
# Starting from original
251+
self.ld.probe_id = self.probe_id2
252+
prev_align = self.ld.get_previous_alignments()
253+
assert(len(prev_align) == 1)
254+
assert(prev_align[0] == 'original')
255+
assert(self.ld.alignments == {})
256+
257+
# Loading in one with alignments
258+
self.ld.probe_id = self.probe_id
259+
prev_align = self.ld.get_previous_alignments()
260+
assert(len(prev_align) == 6)
261+
assert(prev_align[-1] == 'original')
262+
assert(len(self.ld.alignments) == 5)
263+
assert(sorted(self.ld.alignments, reverse=True)[0] == key)
264+
265+
# Now loading back one with nothing
266+
self.ld.probe_id = self.probe_id2
267+
prev_align = self.ld.get_previous_alignments()
268+
assert(len(prev_align) == 1)
269+
assert(prev_align[0] == 'original')
270+
assert(self.ld.alignments == {})
271+
225272
@classmethod
226273
def tearDownClass(cls) -> None:
227274
one.alyx.rest('insertions', 'delete', id=cls.probe_id)
275+
one.alyx.rest('insertions', 'delete', id=cls.probe_id2)
228276

229277

230278
if __name__ == "__main__":

0 commit comments

Comments
 (0)