1818class 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
230278if __name__ == "__main__" :
0 commit comments